限制最大输入字符数(更新)

这篇博客 中提到的限制 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];