在项⽬开发过程中,遇到这么⼀个需求,编辑标签时,输⼊的最⼤长度需要限制为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?
⽬前看来,此⽅法⽆法捕捉粘贴、拼⾳转汉字和联想(例如使⽤拼⾳输“中国”后,直接再键盘的候选词中可以选“万岁”)输⼊导致的变化。
因篇幅问题不能全部显示,请点此查看更多更全内容