您的当前位置:首页正文

iOS对textField进行字符长度限制的办法

2021-11-19 来源:钮旅网
iOS对textField进⾏字符长度限制的办法

在项⽬开发过程中,遇到这么⼀个需求,编辑标签时,输⼊的最⼤长度需要限制为24个字节。

查阅了⼀些材料,并参考了之前项⽬的相关处理办法,今天在这⾥总结⼀下解决⽅案。

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?

⽬前看来,此⽅法⽆法捕捉粘贴、拼⾳转汉字和联想(例如使⽤拼⾳输“中国”后,直接再键盘的候选词中可以选“万岁”)输⼊导致的变化。

因篇幅问题不能全部显示,请点此查看更多更全内容