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
结束。
UITextField的代理方法:textField:shouldChangeCharactersInRange:replacementString的更多相关文章
- textField:shouldChangeCharactersInRange:replacementString:
http://blog.csdn.net/mamong/article/details/44964801
- ios UITextField文本框基本使用,以及所有代理方法的作用
/* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...
- textField代理方法
//textField代理方法// 返回no 不能输入文字- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange ...
- ios文本框基本使用,以及所有代理方法的作用
/* UITextField文本输入框 */ UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(50, 50 ...
- UITextField属性及方法说明
/初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(, , , )] //设置 ...
- 输入框UITextField禁止输入空格方法
方法一:添加代理 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range rep ...
- tableview 代理方法详解
typedef NS_ENUM(NSInteger, UITableViewCellAccessoryType) { UITableViewCellAccessoryNone, // 不显示任何图标 ...
- iOStextView的代理方法展示
UITextView的代理方法 textViewShouldBeginEditing: and textViewDidBeginEditing: - (BOOL)textViewShouldBegin ...
- iOS UITextField的代理<UITextFieldDelegate>的几点笔记
今天做项目的时候,有个需求,点击按钮,就在特定的编辑框输入按钮中的文字,一开始我还以C++的思想来写,先获取光标的位置,然后在判断是否在那个编辑框,进行输入.后来我旁边的同事看到了直接教我用代理方法, ...
随机推荐
- 【原创】.NET平台机器学习组件-Infer.NET连载(二)贝叶斯分类器
本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html 微软Infer.NET机器学习组件文章目录:http:/ ...
- 应用程序框架实战十四:DDD分层架构之领域实体(基础篇)
上一篇,我介绍了自己在DDD分层架构方面的一些感想,本文开始介绍领域层的实体,代码主要参考自<领域驱动设计C#2008实现>,另外参考了网上找到的一些示例代码. 什么是实体 由标识来区分的 ...
- C++中的内存管理
在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...
- 关于JqueryEasyUI集合Kindeditor
写在前面 上一篇<初试JqueryEasyUI(附Demo)>: 在上一篇说过,下面要试下easyui集合编辑器,关于编辑器网上有很多,ckeditor.ueditor.kindedito ...
- 使用Windows EFS(怎么给文件夹加密)进行文件加密
和Windows BitLocker一样,Encrypting File System(EFS,加密文件系统)是Windows内置的一套基于公共密钥的加密机制,可以加密NTFS分区上的文件和文件夹,能 ...
- 相克军_Oracle体系_随堂笔记009-检查点队列
1.检查点队列 checkpoint queue RBA 日志块地址 redo block address LRBA 第一次被脏的地址 HRBA 最近一次被脏的地址 on disk rba 重做日志( ...
- 数据库SQL Service 2014中文版的安装和配置教程
一.我的电脑环境 1.windows8.1(64位) 2.之前电脑没有安装数据库的软件 二.装机之前准备(我这儿提供百度云保存和下载) 1.下载一个“Sql service 2014中文版” http ...
- 第一篇blog
之前不用blog,但是在杭电oj,poj上刷题,总会自己总结题型和使用什么算法,算法模板,自己在笔记本上写,耗时费力,感觉用键盘敲得总结,分享,大家相互学习提高.有时遇到不会做的,或者总是在oj上跑的 ...
- WebGIS中利用AGS JS+eChart实现一些数据展示的探索
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 eChart提供了迁徙图.热点图.夜视图等跟地图能够很好的结 ...
- php插入式排序的两种写法。
百度了下插入式排序,百度百科中php版本的插入式排序如下: function insert_sort($arr) { // 将$arr升序排列 $count = count($arr); for ($ ...