设置了TextView委托:
textView.delegate = self //self being a UITextViewDelegate
但是当文本以编程方式设置时,委托方法不会被调用。
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
如何在不使用响应式的情况下响应文本更改?
设置了TextView委托:
textView.delegate = self //self being a UITextViewDelegate
但是当文本以编程方式设置时,委托方法不会被调用。
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
UITextField
(以及大多数UIKit控件)的行为方式- 当以编程方式设置时不会触发事件。这是有道理的- 可以避免反复、无限制的调用。UITextField
进行子类化,并覆盖text
属性(可能还包括attributedText
)。然后在didSet
块中调用委托方法。UITextField
继承自UIControl
- 我也会调用sendActions(for:)
来触发目标-动作机制。UITextView
,而不是 UITextField
。大部分回答都是相关的,但不幸的是,UITextView
并未继承自 UIControl
,因此无法调用 sendActions(for:)
。 - Jay Whitsitt 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"
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if object == self.textView1{
//do your thing here...
}
}
@objc dynamic
声明您的文本视图变量。NSKeyValueObservation
声明并保存一个变量。observe(_:changeHandler:)
绑定您的文本视图的文本属性,并使用在步骤2中声明的变量保存返回值。changeHandler
中观察变化。例如:
@objc dynamic private var textView: UITextView!
private var observation: NSKeyValueObservation?
func bind() {
observation = observe(\.textView.text, options: [.old, .new]) { object, change in
print(object, change)
}
}
你把代理的textView拼成了_textView。
func textViewDidChange(textView: UITextView) { //Handle the text changes here
print(textView.text); //the textView parameter is the textView where text was changed
}
textView!.delegate = self