如果我用键盘打字,那么textViewDidChange
总是shouldChangeTextInRange
会被调用。但是当我以编程方式更改 textView 时,不会调用委托方法。如何在 textView 中进行编程更改以触发委托方法?
更新
还有其他方法可以以编程方式模拟键盘输入吗?
如果我用键盘打字,那么textViewDidChange
总是shouldChangeTextInRange
会被调用。但是当我以编程方式更改 textView 时,不会调用委托方法。如何在 textView 中进行编程更改以触发委托方法?
更新
还有其他方法可以以编程方式模拟键盘输入吗?
我在我的代码中使用 insert 方法解决了这个问题,而不是更改文本字符串的值。
textView.insertText("Your Text")
几年后才遇到这个问题,但很难找到其他好的答案,所以我想在这里更详细地展示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
委托函数在调用观察者之前运行。附带说明一下,如果您使用attributedText
as 属性,我还建议在该函数中设置属性并返回 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
}
这可确保您不会重复输入到text
andattributedText
属性中的文本。您也可以使用委托函数来拒绝输入,例如换行,它不会调用该observeValue
函数。要重新迭代,仅在函数返回 true 或 false后调用该函数。shouldChangeTextIn
如果这里有任何错误或其他人想添加的任何内容,请随时告诉我。
快乐编程!