2017-04-07 30 views
2

TextView的委托设置的纲领性变化作出反应:当文本被设置编程如何以一个TextView文本

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

textView.delegate = self //self being a UITextViewDelegate 

但委托方法不会被调用

如何响应文本更改而不会反应?

+0

你可能需要添加一些什么功能更改文本...或者,可能子类'UITextView'并添加你自己的“看更改”代码。 – DonMag

回答

0

我只是想上的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框架中的类一般不 支持志愿,你仍然可以实现它在你的应用程序 的自定义对象,包括自定义视图。

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

-2

您有拼写错误的委托与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 
+0

这是正确的,斯威夫特3.0/3.1需要签名。 – satheeshwaran

+0

@Saranjith Nope。这是Swift 3+上的正确签名。 – Carpsen90

0

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

如果你真的通知当文本以编程方式更改,你必须继承UITextField并覆盖text财产(可能attributedText也)。然后在didSet块调用委托方法。

不要忘记,UITextField继承自UIControl - 我也打电话sendActions(for:)使目标行动机制失火。

+0

OP询问“UITextView”,而不是“UITextField”。大部分答案都是相关的,但不幸的是,'UITextView'不能从'UIControl'继承,所以无法调用'sendActions(for:)'。 –

相关问题