如何响应TextView文本的程序更改

时间:2017-04-07 11:49:15

标签: ios swift textview

设置TextView委托:

func textViewDidChange(_ textView: UITextView) {
    print(textView.text)
}

但是当文本设置

时,代理方法不会被调用
imshow

如何在不反应的情况下响应文本更改?

3 个答案:

答案 0 :(得分:0)

这是UITextField(以及大多数UIKit控件)的行为 - 在以编程方式设置时不会触发事件。这是有道理的 - 让你避免重复,无限的呼叫。

如果确实希望在以编程方式更改文本时收到通知,则必须继承UITextField并覆盖text属性(也可能是attributedText)。然后在didSet块调用委托方法。

不要忘记UITextField继承自UIControl - 我也会调用sendActions(for:)来激活目标行动机制。

答案 1 :(得分:0)

我刚在UITextView上尝试过KVO,

 self.textView1.text = "You are working, but I will change you in 5 seconds"

添加你的观察者

self.textView1.addObserver(self, forKeyPath: "text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)

以编程方式触发文本更改,只是按照您想要的方式进行操作。

 DispatchQueue.main.asyncAfter(deadline:.now() + 5) {
    self.textView1.text = "Changed after some time"
}

覆盖KVO方法。

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if object == self.textView1{
     //do your thing here...
    }
}

酷吧!然而,在UIKit上的KVO工作,它确实是苹果文档中的状态如下,仅供参考。

  

注意:虽然UIKit框架的类通常不会   支持KVO,你仍然可以在你的自定义对象中实现它   应用程序,包括自定义视图。

https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/KVO.html

答案 2 :(得分:-1)

您使用带有_textView

的textView错误拼写了委托
clean

将它放在viewDidLoad

func textViewDidChange(textView: UITextView) { //Handle the text changes here
        print(textView.text); //the textView parameter is the textView where text was changed
    }