如此处所述:UITextField text change event,似乎从 iOS 6 开始(检查了 iOS 6.0 和 6.1)仅通过观察 @ 就无法完全检测到 UITextField 对象的变化987654327@。
现在似乎只跟踪那些直接由内置 iOS 键盘进行的更改。这意味着,如果您仅通过调用以下内容来更改 UITextField 对象:myUITextField.text = @"any_text",您将不会收到任何更改的通知。
我不知道这是一个错误还是有意为之。似乎是一个错误,因为我在文档中没有找到任何合理的解释。这也在此处说明:UITextField text change event。
对此,我的“解决方案”实际上是为我对UITextField 所做的每一次更改发布一个通知(如果该更改是在不使用内置 iOS 键盘的情况下完成的)。像这样的:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField];
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification];
这样,当您更改 UITextField 对象的 .text 属性时,无论是在代码中“手动”更新它还是通过内置iOS 键盘。
考虑到这一点很重要,因为这不是记录在案的行为,这种方法可能会导致收到 2 个通知,因为您的 UITextField 对象中的相同更改。根据您的需求(当您的 UITextField.text 更改时您实际执行的操作),这可能会给您带来不便。
如果您确实需要知道通知是您的通知还是“iOS 制造的”通知,则稍有不同的方法是发布自定义通知(即使用UITextFieldTextDidChangeNotification 以外的自定义名称)。
编辑:
我刚刚找到了一种我认为可能会更好的不同方法:
这涉及到 Objective-C (http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA) 的 Key-Value Observing (KVO) 功能。
基本上,您将自己注册为属性的观察者,如果该属性发生更改,您会收到通知。 “原理”与NSNotificationCenter 的工作方式非常相似,这是该方法在 iOS 6 中自动工作的主要优势(无需任何特殊调整,例如必须手动发布通知)。
对于我们的UITextField-scenario,如果您将此代码添加到例如包含文本字段的UIViewController 中,则效果很好:
static void *myContext = &myContext;
- (void)viewDidLoad {
[super viewDidLoad];
//Observing changes to myUITextField.text:
[myUITextField addObserver:self forKeyPath:@"text"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:myContext];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void *)context {
if(context == myContext) {
//Here you get notified every time myUITextField's "text" property is updated
NSLog(@"New value: %@ - Old value: %@",
[change objectForKey:NSKeyValueChangeNewKey],
[change objectForKey:NSKeyValueChangeOldKey]);
}
else
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
感谢这个关于“上下文”管理的答案:https://stackoverflow.com/a/12097161/2078512
注意:似乎当您正在使用内置 iOS 键盘编辑 UITextField 时,文本字段的“文本”属性不会随着每个新字母而更新键入/删除。相反,在您退出文本字段的第一响应者状态后,文本字段对象会“整体”更新。