三味猪屋

iOS7中UITextField切换中文时某些协议方法无响应

UITextField切换中文输入,选中键盘中被mark的中文字符时,iOS7中UITextField不会调用如下协议方法:

1
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string;

解决方法:

1、利用通知中心监听UITextFieldTextDidChangeNotification。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[[NSNotificationCenter defaultCenter]addObserver:self
selector:@selector(textFiledEditChanged:)
name:UITextFieldTextDidChangeNotification
object:self];
- (void)textFiledEditChanged:(NSNotification *)notification
{
if ([notification.object isKindOfClass:[EzvizTokenTextField class]]) {
EzvizTokenTextField *textField = notification.object;
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if (!position) {
self.ezvizTokenTextFieldTextLength = [textField.text length];
}
}
}

当键盘中有mark的中文字符时,则根据UITextField实例方法markedTextRange可以获取开始位置以及长度,此时,只要没有选中被mark的字符时,textFiled.text 的 length是不会改变的。只有当选中被mark的字符时,markedTextRange返回的开始位置以及长度为0,则UITextPosition则为nil,此时说明textField.text 的 length改变。

2、通过KVO监听textField.text 的length。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[self addObserver:self
forKeyPath:@"ezvizTokenTextFieldTextLength"
options:NSKeyValueObservingOptionNew
context:NULL];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (object == self && [keyPath isEqualToString:@"ezvizTokenTextFieldTextLength"]) {
//DDLogInfo(@"ezvizTokenTextFieldTextLength: %d", self.ezvizTokenTextFieldTextLength);
if (self.ezvizTokenTextFieldTextLength) {
if (delegate && [delegate respondsToSelector:@selector(textFieldDidEndChanged:)]) {
[delegate textFieldDidEndChanged:self];
}
}
}
else {
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}

从而可以达到在iOS7下监听UITextField输入框内字符变化。