设置TextView委托:
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
但是当文本设置
时,代理方法不会被调用imshow
如何在不反应的情况下响应文本更改?
答案 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,你仍然可以在你的自定义对象中实现它 应用程序,包括自定义视图。
答案 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
}