如何检测textField中的任何文本更改?委托方法 shouldChangeCharactersInRange
适用于某些东西,但它并不能完全满足我的需要 . 由于它返回YES,因此textField文本不可用于其他观察者方法 .
例如在我的代码 calculateAndUpdateTextFields
没有得到更新的文本,用户已键入 .
他们以任何方式获得类似 textChanged
Java事件处理程序的东西 .
- (BOOL)textField:(UITextField *)textField
shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
{
if (textField.tag == kTextFieldTagSubtotal
|| textField.tag == kTextFieldTagSubtotalDecimal
|| textField.tag == kTextFieldTagShipping
|| textField.tag == kTextFieldTagShippingDecimal)
{
[self calculateAndUpdateTextFields];
}
return YES;
}
18 回答
设置事件监听器:
实际听:
关闭:
和使用
您应该使用通知来解决此问题,因为另一个方法将侦听输入框而不是实际输入,尤其是当您使用中文输入法时 . 在viewDidload中
然后
}
最后,你跑,会完成 .
如上所述:UITextField text change event,似乎 as of iOS 6 (已检查iOS 6.0和6.1)仅通过观察
UITextFieldTextDidChangeNotification
无法完全检测UITextField
对象中的更改 .现在似乎只跟踪由内置iOS键盘直接进行的更改 . 这意味着如果您只是通过调用类似的内容来更改
UITextField
对象:myUITextField.text = @"any_text"
,您将不会收到有关任何更改的通知 .我没有在文档中找到任何合理的解释 . 这也在这里说明:UITextField text change event .
我的"solution"实际上是我自己发布了一个通知,我对我的
UITextField
所做的每一次更改(如果没有使用内置的iOS键盘就完成了更改) . 像这样的东西:这样,当您在代码中更新"manually"或通过内置iOS键盘更改
UITextField
对象的.text
属性时,您将100%确信会收到相同的通知 .重要的是要考虑到,因为这不是记录的行为,这种方法可能会导致收到2个通知,用于
UITextField
对象中的相同更改 . 根据您的需求(当您的UITextField.text
更改时您实际执行的操作),这可能会给您带来不便 .如果您确实需要知道通知是您的还是"iOS-made",那么稍微不同的方法是发布自定义通知(这是使用
UITextFieldTextDidChangeNotification
以外的自定义名称) .EDIT:
我刚刚找到了一种不同的方法,我觉得可能会更好:
这涉及Objective-C的 Key-Value Observing (KVO) 特征(http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/KeyValueObserving.html#//apple_ref/doc/uid/10000177-BCICJDHA) .
基本上,您将自己注册为属性的观察者,如果此属性发生更改,您将收到有关它的通知 . "principle"与
NSNotificationCenter
的工作方式非常相似,这也是iOS 6自动运行的主要优势(没有任何特殊调整,如必须手动发布通知) .对于我们的
UITextField
-scenario,如果您将此代码添加到例如包含文本字段的UIViewController
,则此工作正常:相信"context"管理层的回答:https://stackoverflow.com/a/12097161/2078512
注意:似乎在您使用内置iOS键盘编辑
UITextField
的过程中,文本字段的"text"属性不会在每次输入/删除新字母时更新 . 相反,在您重新调整文本字段的第一个响应者状态后,文本字段对象会更新"as a whole" .Swift 3 Version
并在这里获得更改
希望能帮助到你 .
Swift:
然后,实现回调函数:
Swift 4
XenElement的答案很明显 .
通过右键单击UITextField并将“Editing Changed”发送事件拖到子类单元,也可以在界面构建器中完成上述操作 .
我解决了改变shouldChangeChractersInRange行为的问题 . 如果您返回NO,iOS内部将不会应用更改,您可以手动更改它并在更改后执行任何操作 .
Swift 3.1:
从proper way to do uitextfield text change call back:
您可以使用它并将 calculateAndUpdateTextFields 作为
selector
.Swift 3版本:
不要忘记设置代理 .
对于Swift 3.0:
使用类如:
观察者和反应迅速(RxCocoa&RxSwift)非常简单 .
只需订阅rx的text属性,如下所示:
我们可以轻松地从
Storyboard
配置,CTRL拖动@IBAction
并更改事件如下:Swift Version tested:
Parameters explained:
Then add the method you created above in your UIViewController:
这里的swift版本相同 .
谢谢