UITextfield限制字符长度的问题

项目需求

中英混合输入限制字数

需要了解的

ios状态下,UTF8:数字1个,英文1个,中文3个,emoji4个

    Unicode:数字2个,英文2个,中文2个,emoji4个

如图:

textField代理方法的了解

1
2
3
4
5
6
7
8
9
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
textField ----->当前等待被输入的文本框
range ------>结构体 {location:当前光标所在位置(从textfield起始位置)
lenth:光标的要输入的长度
}
string ------->当前键盘点击的字符串
return NO;----->不响应键盘事件,键盘打出的不会响应到textfield上
return YES;---->响应键盘事件
}

如图:

直接使用代理方法限制会出现的问题

问题一 超过限制字数后,删除键失效,无法修改

解决 修改代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
if (textField == self.textField) {
if (string.length == 0) return YES;
NSInteger existedLength = textField.text.length;
NSInteger selectedLength = range.length;
NSInteger replaceLength = string.length;
if (existedLength - selectedLength + replaceLength > 4) {
return NO;
}
}
return YES;
}

问题二 中文输入法的问题,当最后一个字符以中文形式输入的时候,系统会在键盘上方提供系列的联想词,这样的连续选字输入会突破我们的字符限制(模拟器不会出现问题,但是真机会出现)

问题三 中文输入法下,想输入四个汉字,会出现问题,如图所示,代理方法没有响应到拼音到汉字的过程


当输入张(zhang)的时候,用户输入zhang在为完成之前,拼音”zhan”已经出现在输入框中(textfield)中,并且作为了输入的内容,但是我们想要的不是”zhan”,这样由于我们限制了4个导致”g”无法输入,从而”张”不能输出

解决方案 给textfield添加事件监听或者通知

UITextField有一个属性maskedTextRange用于标识中文拼音输入字母时的情形,所以解决思路:

1.先检测UITextField中的maskedTextRange是否是空,不为空的时候不限制

2.超过限制截取

遗留问题四 中文输入法下 切换为中文输入法自带的英文(而不是系统的英文输入法),输入英文的长度是中文的限制长度
这个人很帅<br>他什么都不想说<br>