如何以一个TextView文本
TextView的委托设置的纲领性变化作出反应:当文本被设置编程如何以一个TextView文本
func textViewDidChange(_ textView: UITextView) {
print(textView.text)
}
textView.delegate = self //self being a UITextViewDelegate
但委托方法不会被调用
如何响应文本更改而不会反应?
我只是想上的UITextView志愿,
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框架中的类一般不 支持志愿,你仍然可以实现它在你的应用程序 的自定义对象,包括自定义视图。
您有拼写错误的委托与TextView的与_textView
func textViewDidChange(textView: UITextView) { //Handle the text changes here
print(textView.text); //the textView parameter is the textView where text was changed
}
在viewDidLoad中将这个
textView!.delegate = self
这是正确的,斯威夫特3.0/3.1需要签名。 – satheeshwaran
@Saranjith Nope。这是Swift 3+上的正确签名。 – Carpsen90
这是怎么UITextField
(大多数UIKit的控件)behave-不会触发事件时,以编程方式设置。它是有道理的 - 让你避免重复的,无限的呼叫。
如果你真的想通知当文本以编程方式更改,你必须继承UITextField
并覆盖text
财产(可能attributedText
也)。然后在didSet
块调用委托方法。
不要忘记,UITextField
继承自UIControl
- 我也打电话sendActions(for:)
使目标行动机制失火。
OP询问“UITextView”,而不是“UITextField”。大部分答案都是相关的,但不幸的是,'UITextView'不能从'UIControl'继承,所以无法调用'sendActions(for:)'。 –
你可能需要添加一些什么功能更改文本...或者,可能子类'UITextView'并添加你自己的“看更改”代码。 – DonMag