在开发中我们常常需要再某些地方限制用户的输入字数的功能。
这里讲一下之前实现这功能遇到的坑,一般我们计算textView、textFiled输入字数的时候,一般是判断已经输入的字符的长度,这种判断方式对于英文、数字或其他字符的时候没问题,但对于中文时问题就来了。当使用的是系统键盘时,当你正在输入拼音,还没拼完的时候,突然发现不能输入了,字符的长度已经超出你限制的最大值了。。原来是输入拼音还处于高亮状态时也同时被计算进长度了,这就尴尬了,所以我们需要再拼音正在输入时,忽略计算高亮的字符。 下面是解决办法,以textview为例:
如果是textview,则用下面方法进行监听输入
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textViewEditChanged:)
name:@"UITextViewTextDidChangeNotification"
object:self];
//计算输入字符长度
-(void)textViewEditChanged:(NSNotification *)obj{
//获取正在输入的textView
UITextView *textView = (UITextView *)obj.object;
NSString *toBeString = textView.text;
NSString *lang = [textView.textInputMode primaryLanguage];
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [textView markedTextRange];
//获取高亮部分
UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (toBeString.length > self.kMaxLength) {
[LSToast showTip:[NSString stringWithFormat:@"长度最长可设置%zd个字",self.kMaxLength]];
textView.text = [toBeString substringToIndex:self.kMaxLength];
[self endEditing:YES];
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
if (toBeString.length > self.kMaxLength) {
[LSToast showTip:[NSString stringWithFormat:@"长度最长可设置%zd个字",self.kMaxLength]];
textView.text = [toBeString substringToIndex:self.kMaxLength];
[self endEditing:YES];
}
}
}
//如果是textField,则用下面监听方法
{
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textFiledEditChanged:)
name:@"UITextFieldTextDidChangeNotification"
object:self];
}
最候记得再dealloc()中移除监听事件。