【问题标题】:detecting the change of content of UITextField when the change is not made by the keyboard当键盘未进行更改时检测 UITextField 内容的更改
【发布时间】:2012-12-06 19:01:51
【问题描述】:

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

附言UITextField's 委托方法在这种情况下不起作用

更新:我希望这种行为出现在 iOS 6+ 设备上。

【问题讨论】:

  • 如果UIButton 连接到更改UITextField's 文本的IBAction,当IBAction 被调用时,您没有收到通知吗?
  • IBAction 在每个iOS 中的工作。澄清一下,如果你给UIButton 绑定了一个改变UITextField 文本的方法,那么为什么不在UIButton 的方法末尾调用另一个方法呢?跨度>
  • 我刚刚通过 KVO 在 iOS6 中做到了。看看我的回答。 ;)

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


【解决方案1】:

您可以添加UITextFieldTextDidChangeNotification:

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

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

【讨论】:

  • 听起来iOS 6有bug,因为在iOS6上不工作,在iOS 5上工作,我会更新问题。
  • 我认为 Apple 改变了这种行为。在这个问题 (stackoverflow.com/questions/12754948/…) 中,这是同样的问题。我没有在 iOS 6 下测试过。
  • 这对我有用,而 UITextFieldDelegate 方法 'textField:shouldChangeCharactersInRange:replacementString:' 总是会触发当前内容的一个字符,而 'addTarget:action:forControlEvents:' 方法,无论是否在代码或 IB(故事板)中的动作永远不会触发!我想这是一个错误(我在 iOS7.0.2 上)。值得庆幸的是,@Sebastian 的回答中描述的通知方法效果很好。
【解决方案2】:

也许简单的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
    }
}

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

【讨论】:

  • 问题在于 UIKit 不兼容 KVO
【解决方案3】:

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

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

【讨论】:

  • 这是手动触发事件,在大型项目中,每次文本更改都发送事件是不切实际的。
【解决方案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.
}

【讨论】:

【解决方案5】:

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

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

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

【讨论】:

  • 不应使用 == 测试 NSString 或任何 NSObject 相等性
【解决方案6】:

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

【讨论】:

    【解决方案7】:

    斯威夫特 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)
            })
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 2016-09-24
      • 2013-02-11
      • 2019-01-24
      相关资源
      最近更新 更多