当键盘没有进行更改时,检测UITextField内容的变化

时间:2012-12-19 12:08:11

标签: iphone objective-c ios cocoa-touch ios6

我有UIButtonUITextField,当按下按钮时,文本字段的内容字符串将等于:This is a test string,如何检测到此文本字段已更改其在这种情况下的内容?

P.S。 UITextField's委托方法在这种情况下不起作用

更新:我希望此行为适用于iOS 6+设备。

8 个答案:

答案 0 :(得分:16)

您可以添加UITextFieldTextDidChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(textFieldChanged:)
                                             name:UITextFieldTextDidChangeNotification
                                           object:textField];

textField(param对象)是你的UITextField。 selector是您在触发此通知时将被调用的方法。

答案 1 :(得分:14)

也许简单的key-value observing会起作用吗?

[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
    }
}

编辑:我刚检查过,它对我有用。

答案 2 :(得分:6)

您可以在UIControlEventEditingChanged事件中处理文本更改。因此,当您以编程方式更改文本时,只需发送此事件:

textField.text = @"This is a test string";
[textField sendActionsForControlEvents:UIControlEventEditingChanged];

答案 3 :(得分:4)

委托方法实际上可能适合您。您将获得文本字段,将更改的范围以及新字符串。您可以将它们放在一起以确定建议的字符串。

- (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.
}

答案 4 :(得分:1)

这是一个非常强大的解决方案,但应该可行。在您按下按钮时调用的函数...

NSString *string = [NSString stringWithFormat:@"This is a test string"];
if(string == textfield.text){
...
}

或者,您可以使用自我调度程序来检查它是否反复更改。

答案 5 :(得分:1)

以下是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
    }
}

答案 6 :(得分:0)

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
     //You code here...
}
你试过这个吗?

答案 7 :(得分:0)

斯威夫特 5.4

这是 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)
        })
    }
}