如此指出:UITextField文本更改事件,似乎在iOS 6(已检查iOS 6.0和6.1)之后仅观察 UITextFieldTextDidChangeNotification
不能完全检测 UITextField
对象的更改。
现在,似乎只有内置的iOS键盘直接进行的更改才会被跟踪。这意味着,如果您仅通过调用以下命令更改 UITextField
对象: myUITextField.text = @“任何文本”
,则将不会收到任何更改通知。
我不知道这是一个错误还是一个意图。由于我在文档中没有找到任何合理的解释,因此似乎像个错误。这也在此处指出:UITextField文本更改事件。
我对此的“解决方案”实际上是,对于我对 UITextField
所做的每个更改(如果该更改没有使用内置的iOS键盘),都会发布一个通知。类似于这样:
myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code"
NSNotification *myTextFieldUpdateNotification =
[NSNotification notificationWithName:UITextFieldTextDidChangeNotification
object:myUITextField]
[NSNotificationCenter.defaultCenter
postNotification:myTextFieldUpdateNotification]
通过这种方式,您可以100%确定,在更改您的UITextField
对象的.text
属性时,无论是在代码中“手动”更新还是通过内置的iOS键盘,都将收到相同的通知。
需要注意的是,由于这不是一种文档记录的行为,因此这种方法可能会导致您的UITextField
对象发生相同更改的情况下收到2个通知。根据您的需求(当UITextField.text
更改时实际上要执行什么操作),这可能对您造成不便。
稍微不同的方法是,如果您确实需要知道通知是您的还是“iOS制作的”,则可以发布自定义通知(即,具有自定义名称而不是UITextFieldTextDidChangeNotification
)。
编辑:
我刚找到了一种不同的方法,我认为这可能更好:
这涉及Objective-C的键值观察(KVO)功能(http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA)。
基本上,您可以将自己注册为属性的观察者,如果该属性发生更改,则会收到通知。 “原则”与NSNotificationCenter
的工作方式非常相似,主要优点是这种方法也可以在iOS 6中自动工作(无需任何特殊调整,例如手动发布通知)。
对于我们的UITextField
场景,如果您将此代码添加到包含文本字段的UIViewController
中,则可以正常工作:
static void *myContext = &myContext;
- (void)viewDidLoad {
[super viewDidLoad];
[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) {
NSLog(@"New value: %@ - Old value: %@",
[change objectForKey:NSKeyValueChangeNewKey],
[change objectForKey:NSKeyValueChangeOldKey]);
}
else
[super observeValueForKeyPath:keyPath ofObject:object
change:change context:context];
}
关于"上下文"管理的答案感谢: https://dev59.com/imw15IYBdhLWcg3wfr5x#12097161
注意:当您正在使用内置iOS键盘编辑UITextField
时,似乎您输入或删除每个新字母时文本字段的"text"属性不会更新。相反,在您放弃文本字段的第一响应者状态之后,文本字段对象会整体更新。