原文链接: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

结束。

UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString的更多相关文章

  1. textField:shouldChangeCharactersInRange:replacementString:

    http://blog.csdn.net/mamong/article/details/44964801

  2. ios UITextField文本框基本使用,以及所有代理方法的作用

    /* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...

  3. textField代理方法

    //textField代理方法// 返回no 不能输入文字- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange ...

  4. ios文本框基本使用,以及所有代理方法的作用

    /* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...

  5. UITextField属性及方法说明

    /初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )] //设置 ...

  6. 输入框UITextField禁止输入空格方法

    方法一:添加代理 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range rep ...

  7. tableview 代理方法详解

    typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone, // 不显示任何图标 ...

  8. iOStextView的代理方法展示

    UITextView的代理方法 textViewShouldBeginEditing: and textViewDidBeginEditing: - (BOOL)textViewShouldBegin ...

  9. iOS UITextField的代理<UITextFieldDelegate>的几点笔记

    今天做项目的时候,有个需求,点击按钮,就在特定的编辑框输入按钮中的文字,一开始我还以C++的思想来写,先获取光标的位置,然后在判断是否在那个编辑框,进行输入.后来我旁边的同事看到了直接教我用代理方法, ...

随机推荐

  1. ScrollView中嵌套GridView,ListView只显示一行的解决办法

    转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView, ...

  2. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Software Protector序列号生成组件.今天就通过一篇简单的文章来预览一下其强大的功 ...

  3. DDD 领域驱动设计-“臆想”中的实体和值对象

    其他博文: DDD 领域驱动设计-三个问题思考实体和值对象 DDD 领域驱动设计-三个问题思考实体和值对象(续) 以下内容属于博主"臆想",如有不当,请别当真. 扯淡开始: 诺兰的 ...

  4. 开启了HA的XenServer如何关闭虚拟机?

    可开启了HA很方便,在主机自己坏掉的情况下其中的虚拟机能自己飘到活的机器上并被运行起来,不过如果手动的需要关闭虚拟机的话在这情况下,该虚拟机会自己"复活"即便我们选的是关机. 此时 ...

  5. unbuntu14.04 安装nginx配置

    记录一下linux下安装nginx的所需要的配置. 首先从 nginx官网 下载所需要的版本,复制链接,执行 wget http://nginx.org/download/nginx-1.8.0.ta ...

  6. 记一次由于Java泛型类型擦除而导致的问题,及解决办法

    中所周知,Java中的泛型并不像C++.C#一样是真正的泛型,其泛型是通过类型擦除来实现的.具体什么是类型擦除,可以参看这篇博文:http://icyfenix.iteye.com/blog/1021 ...

  7. 几个步骤轻松搞定ASP.NET 依赖注入。

    http://www.it165.net/pro/html/201407/17685.html 我在网上看到了这篇文章,这边文章主要说的方法就是通过读取配置文件来解决依赖注入的问题.但是每次新建一个依 ...

  8. sql 索引 的建立

    (From:http://54laobaixing.blog.163.com/blog/static/57843681200952411133121/) 假设你想找书中的某一个句子.你可以一页一页地逐 ...

  9. C# 利用socekt做到http监听,怎么样才能做到高性能

    c#原始提供了http的监听的类HttpListener,实现了简单的http.文章地址<C# 控制台或者winform程序开启http的监听状态> 但是经过我测试,这个HttpListe ...

  10. 从零开始,搭建博客系统MVC5+EF6搭建框架(3),添加Nlog日志、缓存机制(MemoryCache、RedisCache)、创建控制器父类BaseController

    一.回顾系统进度以及本章概要 目前博客系统已经数据库创建.以及依赖注入Autofac集成,接下来就是日志和缓存集成,这里日志用的是Nlog,其实还有其他的日志框架如log4,这些博客园都有很多介绍,这 ...