【问题标题】:How to trigger textViewdelegate on programmatical UITextView edits如何在编程 UITextView 编辑时触发 textViewdelegate
【发布时间】:2014-11-21 06:54:29
【问题描述】:

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

更新

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

【问题讨论】:

  • 以编程方式究竟改变了什么,是什么意思?? ...您确定代表?
  • 写下您要更改文本而不是调用代表的代码
  • @KumarKL 表示通过代码设置text 属性。
  • 对于所有这些澄清要求来说,这个问题太简单了。它使提问的人看起来好像他们不知道如何编码或如何阅读。 OP 正在做textView.text=@"some text";,而不是用键盘打字。此外,@KumarKL 如果未设置委托,怎么可能调用它们进行键盘输入。来吧:只需阅读问题。很简单。
  • 我不必知道答案就会发现所有这些请求都很荒谬。我不是要伤害你的自尊心。但问题是如此明确,我不得不说些什么来阻止这种疯狂。我不是要挑剔你,因为你不是唯一一个问你的人。但它已经到了有人可能会问delegate是什么意思的地步。再说一遍:问题很清楚!

标签: ios uitextview uitextviewdelegate


【解决方案1】:

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

textView.insertText("Your Text")

【讨论】:

    【解决方案2】:

    几年后才遇到这个问题,但很难找到其他好的答案,所以我想更详细地展示Satheesh's technique 回答here,这对我未来的读者和遇到类似情况的人有用问题。

    技术

    首先,在 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 函数将在您添加观察者的textViewproperty 值发生更改后运行。请注意,当您以编程方式设置 textView 的文本时,例如:

    textView.text = "programmatically assigned text"
    

    shouldChangeTextIn 委托函数在调用观察者之前运行。附带说明一下,如果您使用 attributedText 作为属性,我还建议在该函数中设置属性并返回 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
        
    }
    

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

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

    编程愉快!

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多