UITextField根据输入内容修改背景色的代码不生效,如何解决?
问题原因
- 触发时机错误:
changeColor()仅在viewDidLoad中调用了一次,此时输入框未输入内容,后续用户输入文本时没有触发该方法,自然不会实时更新背景色 - 变量拼写错误:代码中判断
text == "red"的分支里,变量名写为myTextfield(末尾f小写),和正确的变量名myTextField不一致,会导致编译报错或运行时赋值失败 - 现有代理方法逻辑不符合需求:
textField(_:shouldChangeCharactersIn:replacementString:)是文本修改之前触发的代理,即使你在这个方法里调用changeColor(),拿到的也是修改前的旧文本,无法匹配最新输入的内容
修复方案
- 先修正拼写错误,将
myTextfield.backgroundColor = .red改为myTextField.backgroundColor = .red - 给输入框添加文本编辑变更的监听事件,每次输入完成后自动触发
changeColor() - 给
changeColor()添加@objc标记,支持selector调用
代码示例
// 在viewDidLoad中添加监听 override func viewDidLoad() { super.viewDidLoad() // 原有其他逻辑 myTextField.addTarget(self, action: #selector(changeColor), for: .editingChanged) } // 修正后的changeColor方法 @objc func changeColor() { if myTextField.text == "blue" { myTextField.backgroundColor = .blue } else if myTextField.text == "red" { myTextField.backgroundColor = .red } else { myTextField.backgroundColor = .black } } // 原有长度限制代理逻辑可以保留,不影响功能 func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { if textField == myTextField { // 最多允许输入4个字符,刚好覆盖red(3位)、blue(4位)的长度需求 if range.location > 3 { return false } } return true }
内容的提问来源于stack exchange,提问作者László Gábor
相关产品推荐
相关产品推荐

