7

如果我用键盘打字,那么textViewDidChange总是shouldChangeTextInRange会被调用。但是当我以编程方式更改 textView 时,不会调用委托方法。如何在 textView 中进行编程更改以触发委托方法?

更新

还有其他方法可以以编程方式模拟键盘输入吗?

4

2 回答 2

6

我在我的代码中使用 insert 方法解决了这个问题,而不是更改文本字符串的值。

textView.insertText("Your Text")
于 2018-04-13T07:38:05.910 回答
0

几年后才遇到这个问题,但很难找到其他好的答案,所以我想在这里更详细地展示Satheesh技术,这些技术对我未来的读者和遇到类似问题的人有用。

技术

首先,在 textView 中添加一个观察者:

let property = "text" //can also be attributedText for attributed strings
self.textView.addObserver(self, forKeyPath: property, options: NSKeyValueObservingOptions(rawValue: 0), context: nil)

接下来,重写该observeValue函数:

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

observeValue函数将property在您添加观察者的值textView更改后运行。请注意,当您以编程方式设置textView类似的文本时:

textView.text = "programmatically assigned text"

shouldChangeTextIn委托函数在调用观察者之前运行。附带说明一下,如果您使用attributedTextas 属性,我还建议在该函数中设置属性并返回 false:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        
        let newString = NSString(string: textView.text!).replacingCharacters(in: range, with: text)
        textView.attributedText = createAttributedString(text: newString)
        return false
    
}

这可确保您不会重复输入到textandattributedText属性中的文本。您也可以使用委托函数来拒绝输入,例如换行,它不会调用该observeValue函数。要重新迭代,仅在函数返回 true 或 false调用该函数。shouldChangeTextIn

如果这里有任何错误或其他人想添加的任何内容,请随时告诉我。

快乐编程!

于 2020-12-06T22:42:48.040 回答