【问题标题】:UITextView delegate calling multiple timesUITextView 委托多次调用
【发布时间】:2017-05-28 21:11:11
【问题描述】:

我正在使用 UITextView 并实现了委托功能

var count = 0
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
    print(text)
    count += 1
    print(count)
    return true
}

样本

当我从键盘选择预测文本时,shouldChangeTextInRange 委托调用了两次。

  1. 为什么这个委托调用了两次?
  2. 为什么单独使用预测文本会发生这种情况

【问题讨论】:

  • 您是否要计算字符数?如果是这样,那是行不通的,因为删除一个字符会增加而不是减少它
  • count 是看代理被调用了多少次
  • 那有什么问题呢?为什么在您的应用程序中被调用两次?
  • 当我从预测文本(键盘上方的自动建议文本)中选择任何单词时,代表会调用两次。想控制它。如果它被调用两次,我放置在 shouldTextChangeInRange 中的逻辑将无法按预期工作
  • 我不确定它是否适合您但是当您当时从预测的单词中选择单词时,它首先设置一个单词然后附加一个空格,这就是它调用委托两次的原因。所以简单的解决方案是在删除空格后检查插入的字符数。将代码发布到下一个评论中请检查。它对我有用

标签: ios swift uitextview uitextviewdelegate


【解决方案1】:

请使用此代码。它会正常工作,并希望它与您现有的逻辑完美配合。

 var count = 0
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        print(text)
        let trimmedString = text.trimmingCharacters(in: .whitespaces)
        if(trimmedString.characters.count != 0){
        count += 1
        print(count)
        }
        return true
    }

问题 1 和 2 的答案是 当您从预测文本中选择文本时。首先,它附加单词,然后附加一个空格。这就是委托被调用两次的原因。

【讨论】:

  • 如果 textView 的 text 或 attributedText 属性在此委托方法内被修改,则它被调用三次
  • 我遇到了@Shyam 描述的相同问题。 Richard Venable 在stackoverflow.com/a/26789344 中描述的有点老套但有效的解决方案
【解决方案2】:

每当用户键入新字符或删除现有字符时,文本视图都会调用此方法。此方法的实现是可选的。您可以使用此方法在文本提交到文本视图存储之前替换文本。例如,拼写检查器可能会使用此方法将拼写错误的单词替换为正确的拼写。

来自苹果文档https://developer.apple.com/reference/uikit/uitextviewdelegate/1618630-textview

【讨论】:

    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    相关资源
    最近更新 更多