使用 UITextFieldDelegate 和自定义输入容器

Working with UITextFieldDelegate and a custom input container

在我当前的应用程序中,我创建了一个自定义输入容器供用户输入评论。请参考下图。

文本字段设置为 UITextFieldDelegate 的委托,我想使用 shouldChangeCharactersInRange,这样如果文本字段为空,sendButton 为灰色,并且当至少填充 1 个字符时,它变为蓝色。然而,目前使用我的代码,sendButton 开始时是蓝色的,当输入 1 个字符时变为灰色,然后当字符大于 1 时变回蓝色。有点奇怪,试图弄清楚为什么会这样。这是我当前的相关代码:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if (textField.text?.characters.count)! > 0 {
        sendButton.setTitleColor(ovencloudBlueText, for: .normal)
    } else {
        sendButton.setTitleColor(newLoginGrayText, for: .normal)
    }
    return true
}

我知道我可能缺少一些简单的东西。如果这可能是重复,请告诉我,我会在查看参考 link 后删除此 post。非常感谢您的投入。

这是因为 shouldChangeCharactersIn 在更新 ui 之前触发。所以它以蓝色开头,因为文本字段是空的。当您输入第一个字符时,shouldChangeCharactersIn 有效,但如果您此时检查 textField.text?.characters.count,您会看到它是 0sendButton.setTitleColor(newLoginGrayText, for: .normal) 有效。当您输入第二个字符时,textField.text?.characters.count 出现 1 并变为蓝色。你可以做你想做的事;

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        let  char = string.cString(using: String.Encoding.utf8)!
        let isBackSpace = strcmp(char, "\b")

        if (isBackSpace == -92) {
            print("Backspace was pressed")
        }

        if (textField.text?.characters.count)! == 0 {
          sendButton.setTitleColor(ovencloudBlueText, for: .normal)
        }
        else if (textField.text?.characters.count)! == 1 && isBackSpace == -92 {
          sendButton.setTitleColor(newLoginGrayText, for: .normal)
        }

    return true
}

你会看到它有效