2017-04-07 70 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:)'。 –

相關問題