在 这篇博客 中提到的限制 UITextView 最大输入字符数的方法,依然是有问题的。问题出现于用拼音输入法输入中文的时候,比如键入“你好世界”,对应的拼音为“nihaoshijie”。限制最大长度为 5,则虽然“你好世界”为四个字,但在输入拼音字符的时候,会超过 5 个字符,导致无法输入进去。
iOS:UITextField中文输入法输入时对字符长度的限制 这篇文章中提出了一个方法,经尝试是可以正确处理这种情形的。基本方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| - (void)textViewDidChange:(UITextView *)textView { 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 (textView.text.length > LENGTH_LIMIT) { textView.text = [textView.text substringToIndex:LENGTH_LIMIT]; } } else{ } } else { if (textView.text.length > LENGTH_LIMIT) { textView.text = [textView.text substringToIndex:LENGTH_LIMIT]; } } }
|
同时,在上面这篇文章中还受到一点启示,UITextField 是没有类似 textViewDidChange 这样的代理方法的,所以对于 UITextField 我们该怎么办?可以通过监听 UITextFieldTextDidChangeNotification
通知来达到一样的目的。
在初始化时添加监听:
1
| [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldDidChanged:) name:@"UITextFieldTextDidChangeNotification" object:_textField];
|
实现监听方法:
1 2 3 4
| -(void)textFieldDidChanged:(NSNotification *)notification { UITextField *textField = (UITextField*)notification.object; ... }
|
别忘了在 dealloc 时移除监听:
1
| [[NSNotificationCenter defaultCenter] removeObserver:self name:@"UITextFieldTextDidChangeNotification" object:_textField];
|