iOS对textField进行字符长度限制的办法
2016-07-25 08:21
369 查看
在项目开发过程中,遇到这么一个需求,编辑标签时,输入的最大长度需要限制为24个字节。
查阅了一些材料,并参考了之前项目的相关处理办法,今天在这里总结一下解决方案。
1.添加对UITextField的编辑变化事件的监听:
2.实现对应的action:
说明:如果内容超长,就干掉最后一个字,再判断是否超过限制长度,如此循环,直到满足长度限制要求。这里注意一下,直接使用length方法,返回的字符数,而不是字节数,lengthOfBytesUsingEncoding可返回指定字符编码的字节数。
另外,中文输入时,和平时英文输入会不太一样,中文输入会出现正在输入拼音,还没有选汉字,拼音已经上去了:
这时,拼音本身占的字节可能大于选字后的汉字所占的字节,例如输入zhong,占5个字节,而如果用户选择“中”,只占三个字节。如果不专门考虑这种情况,就会出现明明还可以再输一个中文汉字,但是输入拼音的时候没法完成zhong的拼音输入。所以需要判断当时textField是否有已选中的内容。
3.针对步骤2中的图,如果在出现图中的状态下直接保存,那么textfiled会把未转换为汉字的拼音也一起保存进去。所以还需要在使用textfield的内容前再进行一下处理,把超出的部分删除:
Done。如果有什么问题,欢迎留言指出,一起讨论。
补充点东西:
为什么不用UITextField的代理方法shouldChangeCharactersInRange?
目前看来,此方法无法捕捉粘贴、拼音转汉字和联想(例如使用拼音输“中国”后,直接再键盘的候选词中可以选“万岁”)输入导致的变化。
查阅了一些材料,并参考了之前项目的相关处理办法,今天在这里总结一下解决方案。
1.添加对UITextField的编辑变化事件的监听:
[self.textField addTarget:self action:@selector(textLengthChange:) forControlEvents:UIControlEventEditingChanged];
2.实现对应的action:
-(void)textLengthChange:(id)sender { UITextField * textField=(UITextField*)sender; NSString * temp = textField.text; if (textField.markedTextRange ==nil) { while(1) { if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= kMaxByteOfAlarmName) { break; } else { temp = [temp substringToIndex:temp.length-1]; } } textField.text=temp; } }
说明:如果内容超长,就干掉最后一个字,再判断是否超过限制长度,如此循环,直到满足长度限制要求。这里注意一下,直接使用length方法,返回的字符数,而不是字节数,lengthOfBytesUsingEncoding可返回指定字符编码的字节数。
另外,中文输入时,和平时英文输入会不太一样,中文输入会出现正在输入拼音,还没有选汉字,拼音已经上去了:
这时,拼音本身占的字节可能大于选字后的汉字所占的字节,例如输入zhong,占5个字节,而如果用户选择“中”,只占三个字节。如果不专门考虑这种情况,就会出现明明还可以再输一个中文汉字,但是输入拼音的时候没法完成zhong的拼音输入。所以需要判断当时textField是否有已选中的内容。
3.针对步骤2中的图,如果在出现图中的状态下直接保存,那么textfiled会把未转换为汉字的拼音也一起保存进去。所以还需要在使用textfield的内容前再进行一下处理,把超出的部分删除:
-(void)repairTextField { NSString * temp = self.textField.text; while(1) { if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] <= kMaxByteOfAlarmName) { break; } else { temp = [temp substringToIndex:temp.length-1]; } } self.textField.text=temp; }
Done。如果有什么问题,欢迎留言指出,一起讨论。
补充点东西:
为什么不用UITextField的代理方法shouldChangeCharactersInRange?
目前看来,此方法无法捕捉粘贴、拼音转汉字和联想(例如使用拼音输“中国”后,直接再键盘的候选词中可以选“万岁”)输入导致的变化。
相关文章推荐
- iOS开发74-XCode(7.3.1)使用Instruments(7.3.1)测试内存泄漏例子(循环引用)
- WWDC2016 Session笔记 - Xcode 8 Auto Layout新特性
- ios memset EXC_BAD_ACCESS
- iOS 分享的半透明界面
- iOS 编程思想 链式编程思想
- 一文让你彻底了解iOS字体相关知识
- 精通IOS-在表单元中添加子视图
- 【iOS开发】简易加法计算器的实现
- 精通IOS开发-表视图的使用
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解
- IOS轮播图实现
- iOS 在某一个ViewController跳转到TabViewController中的某一个ViewController
- iOS音视频实现边下载边播放
- iOS NSMapTable
- iOS 实现不定参数方法
- IOS 如何避免Block的循环引用
- 使用Xcode Instruments Leak解决内存泄漏问题
- iOS单元测试/Kiwi/TDD/Code Coverage
- iOS的MD5/SHA1加密算法的实现
- 从极光推送的实现原理概括iOS和Andriod推送原理