zoukankan      html  css  js  c++  java
  • UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString

    原文链接:http://www.cnblogs.com/zhanggui/p/6101813.html

    这个我在开发的过程中用到的次数最多,因此这里就简单对其进行分析。先看看Command+点击 弹出的内容解释:

    它的解释大概意思如下:告诉代理方法指定的text应不应该改变。textfiled会在用户输入内容改变的情况下调用。使用这个方法来验证使用时用户输入的类型。例如,你可以使用这个方法来让用户只是输入数字,而没有其他字符。

    它的string参数:用来在指定范围替换的字符。在输入的过程中,这个参数只包含单个输入的字符,比如要输入一句我是程序员,可以看一下结果:

    2016-11-25 14:51:42.602606 OnlyNumberTextField[2385:416738] string:➒---Range's location:0,Range's length:0
    2016-11-25 14:51:42.799856 OnlyNumberTextField[2385:416738] string:➏---Range's location:1,Range's length:0
    2016-11-25 14:51:43.373470 OnlyNumberTextField[2385:416738] string:我---Range's location:0,Range's length:2
    2016-11-25 14:51:45.202028 OnlyNumberTextField[2385:416738] string:➐---Range's location:1,Range's length:0
    2016-11-25 14:51:45.603080 OnlyNumberTextField[2385:416738] string:➍---Range's location:2,Range's length:0
    2016-11-25 14:51:45.800381 OnlyNumberTextField[2385:416738] string:➍---Range's location:3,Range's length:0
    2016-11-25 14:51:46.357566 OnlyNumberTextField[2385:416738] string:是---Range's location:1,Range's length:3
    2016-11-25 14:51:47.067459 OnlyNumberTextField[2385:416738] string:➋---Range's location:2,Range's length:0
    2016-11-25 14:51:47.701954 OnlyNumberTextField[2385:416738] string:➍---Range's location:3,Range's length:0
    2016-11-25 14:51:47.865956 OnlyNumberTextField[2385:416738] string:➌---Range's location:4,Range's length:0
    2016-11-25 14:51:48.068942 OnlyNumberTextField[2385:416738] string:➏---Range's location:5,Range's length:0
    2016-11-25 14:51:48.148413 OnlyNumberTextField[2385:416738] string:➍---Range's location:6,Range's length:0
    2016-11-25 14:51:59.334791 OnlyNumberTextField[2385:416738] string:程---Range's location:2,Range's length:5
    2016-11-25 14:52:00.459496 OnlyNumberTextField[2385:416738] string:序---Range's location:3,Range's length:0
    2016-11-25 14:52:01.760261 OnlyNumberTextField[2385:416738] string:员---Range's location:4,Range's length:0
    

    看到这个结果凌乱了,还有黑圈数字啥的。那个是占位还没有输入内容的时候的字母提示。然后输入的打印结果就是上面的内容。如果是粘贴,这个string还可能包含更多的字符。当用户删除一个或者多个字符的时候:

    2016-11-25 14:54:16.152642 OnlyNumberTextField[2385:416738] string:---Range's location:4,Range's length:1
    2016-11-25 14:54:16.602975 OnlyNumberTextField[2385:416738] string:---Range's location:3,Range's length:1
    2016-11-25 14:54:17.049679 OnlyNumberTextField[2385:416738] string:---Range's location:2,Range's length:1
    2016-11-25 14:54:17.466124 OnlyNumberTextField[2385:416738] string:---Range's location:1,Range's length:1
    2016-11-25 14:54:18.436184 OnlyNumberTextField[2385:416738] string:---Range's location:0,Range's length:1
    

    这个string就是空的。

    这里的返回值BOOL:YES表示指定的text范围应该被替换成string,否则还是保持原样。

    下面举两个例子说明:

    第一个:用来验证只能输入数字:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
        NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
        if ([string isEqualToString:filteredStr]) {
            return YES;
        }
        return NO;
    }
    

    这里用到了NSCharacterSet类,还有一个array的方法componentsJoinedByString:。该方法的作用是将数组内容进行组合,然后生成一个字符串比如:

    NSArray *pathArray = [NSArray arrayWithObjects:@"here", @"be", @"dragons", nil];
    NSLog(@"%@",[pathArray componentsJoinedByString:@""]);
    

    输出结果就是:herebedragons

    如果ByString后面是@" ",结果就会是:here be dragons。这里还有一个NSString的方法:

    - (NSArray<NSString *> *)componentsSeparatedByCharactersInSet:(NSCharacterSet *)separator
    

    该方法的而作用是通过set来进行分割字符串,返回分割后的数组。例如:

     NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456"];
        NSString *nam = @"1g2h45j3d688";
        NSLog(@"%@",[nam componentsSeparatedByCharactersInSet:set]);
    

    结果如下:

    2016-11-25 15:25:56.615351 OnlyNumberTextField[2403:421474] (
        "",
        g,
        h,
        "",
        j,
        d,
        88
    )
    

    如果上面的set 调用 invertedSet输出结果如下:

    2016-11-25 15:27:29.218759 OnlyNumberTextField[2405:421836] (
        1,
        2,
        45,
        3,
        6,
        "",
        ""
    )

    因此以下的代码:

     NSCharacterSet *set = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
        NSString *nam = @"1g2h45j3d688";
        NSArray *arr = [nam componentsSeparatedByCharactersInSet:set];
        NSLog(@"%@",[arr componentsJoinedByString:@""]);
    

    输出结果就是:12453688

    因此就拿只能输入数字这个方法而言,方法里面先设置了一个反转的set,然后将将要替换的字符进行过滤,如果过滤后还是和原来一样,说明满足过滤标准,就替换原有字符。如果不符合原有标准就在直接返回NO,也就意味着不替换原有字符,保持原样。

    此外,还有只能输入字母和数字的判断方法:

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
        NSCharacterSet *charSet = [[NSCharacterSet characterSetWithCharactersInString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"] invertedSet];
        NSString *filteredStr = [[string componentsSeparatedByCharactersInSet:charSet] componentsJoinedByString:@""];
        if ([string isEqualToString:filteredStr]) {
            return YES;
        }
        return NO;
    }
    

    和只输入数字的方法差不多,只是过滤条件有所差异。

     比如你还想只输入字母,你可以直接修改set为:ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

    结束。

  • 相关阅读:
    使用MetaLogo对不等长序列绘制Sequence logo
    RocketMQ源码 索引文件/indexFile 和 消费队列/ConsumeQueue
    看了两篇教程,我的博客炸了
    BCD注册表找不到怎么办?
    扫一扫PC版 V0.3
    java_Lambda表达式
    Java_多线程
    java_静态方法和非静态方法的区别
    idea_快捷键
    Java_稀疏数组
  • 原文地址:https://www.cnblogs.com/zhanggui/p/6101813.html
Copyright © 2011-2022 走看看