TextView对Delegate无反应的解决办法

今天写了一个调用语音识别SDK,然后显示在TextView中的页面。希望能停止输入两秒钟之后自动关闭这个View并且开始用刚才识别出的句子进行搜索。
需要实时监听TextView中的text变化,一旦两秒无变化就停止识别。
然而写的时候发现UITextViewDelegate里面的
- (void)textViewDidChange:(UITextView *)textView;
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
和通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewChanged:) name:UITextViewTextDidChangeNotification object:nil];
都只对用户输入有反应,直接对text赋值并不触发这些方法。

一番搜索之后在StackOverFlow上找到了解决方法,使用KVO。
原答案是Swift版本

self.textView1.addObserver(self, forKeyPath: "text", options: NSKeyValueObservingOptions(rawValue: 0), context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    if object == self.textView1{
     //do your thing here...
    }
}

我改成了OC版本

[self.textView1 addObserver:self forKeyPath:@"text" options:NSKeyValueObservingOptionInitial context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (object == self.textView1) {
     //do your thing here...
    }
}

你可能感兴趣的:(TextView对Delegate无反应的解决办法)