我有 aUIButton
和 a UITextField
,当按下按钮时,文本字段的内容字符串将等于:This is a test string
,在这种情况下,如何检测到该文本字段已更改其内容?
psUITextField's
委托方法在这种情况下不起作用
更新:我希望这种行为出现在 iOS 6+ 设备上。
我有 aUIButton
和 a UITextField
,当按下按钮时,文本字段的内容字符串将等于:This is a test string
,在这种情况下,如何检测到该文本字段已更改其内容?
psUITextField's
委托方法在这种情况下不起作用
更新:我希望这种行为出现在 iOS 6+ 设备上。
您可以添加UITextFieldTextDidChangeNotification
:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(textFieldChanged:)
name:UITextFieldTextDidChangeNotification
object:textField];
textField
(param object) 是你的 UITextField。
selector
是触发此通知时将调用的方法。
也许简单的键值观察会起作用?
[textField addObserver:self forKeyPath:@"text" options:0 context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if([keyPath isEqualToString:@"text"] && object == textField) {
// text has changed
}
}
编辑:我刚刚检查过,它对我有用。
UIControlEventEditingChanged
您可以在事件中处理文本更改。因此,当您以编程方式更改文本时,只需发送此事件:
textField.text = @"This is a test string";
[textField sendActionsForControlEvents:UIControlEventEditingChanged];
委托方法实际上可能对您有用。您将获得文本字段、将更改的范围和新字符串。您可以将这些放在一起以确定建议的字符串。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSMutableString *proposed = [NSMutableString stringWithString:textField.text];
[proposed replaceCharactersInRange:range withString:string];
NSLog(@"%@", proposed);
// Do stuff.
return YES; // Or NO. Whatever. It's your function.
}
这是一个非常强大的解决方案,但它应该可以工作。在按下按钮时调用的函数中......
NSString *string = [NSString stringWithFormat:@"This is a test string"];
if(string == textfield.text){
...
}
或者,您可以使用自调度程序检查它是否重复更改。
这是 akashivskyy 答案的 Swift3 版本:
func startObservingTextView() {
textView.addObserver(self, forKeyPath:"text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)
}
func stopObservingTextView() {
textView.removeObserver(self, forKeyPath: "text")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let textViewObject = object as? UITextView, textViewObject == textView, keyPath == "text" {
// text has changed
}
}
这是 akashivskyy 答案的 Swift 5.4 版本:
使用NSKeyValueObservation键值观察。
class ViewController: UIViewController {
@IBOutlet weak var txtTextField: UITextField!
private var textObservation: NSKeyValueObservation?
override func viewDidLoad() {
super.viewDidLoad()
textObservation = self.txtTextField.observe(\.text, options: [.new, .old], changeHandler: { (object, value) in
print("New value is : ", value.newValue)
print("Old value is : ", value.oldValue)
})
}
}