如何在不刷新TableView时随TextField状态修改其边框颜色?
解决TextField边框颜色随响应状态变化的问题
可以通过UITextFieldDelegate的代理方法直接监听TextField的编辑状态变化,无需刷新TableView就能修改边框颜色,具体实现如下:
1. 实现编辑状态监听的代理方法
在你的UITextFieldDelegate扩展中添加两个关键方法,分别处理开始编辑(成为firstResponder)和结束编辑(失去响应)的场景:
extension ChangePasswordViewController: UITextFieldDelegate { func textFieldDidBeginEditing(_ textField: UITextField) { guard let roundTextField = textField as? RoundTextField else { return } // 成为firstResponder时设置边框为黑色 roundTextField.layer.borderColor = UIColor.black.cgColor } func textFieldDidEndEditing(_ textField: UITextField) { if textField.tag == 0 { viewModel.pwValue = textField.text ?? "" } else { viewModel.confirmPwValue = textField.text ?? "" } guard let roundTextField = textField as? RoundTextField else { return } // 失去响应时恢复为灰色 roundTextField.layer.borderColor = UIColor.gray.cgColor } }
2. 设置初始边框颜色与代理
在viewDidLoad中完成初始边框颜色设置,并绑定TextField的代理:
override func viewDidLoad() { super.viewDidLoad() hideKeyboardWhenTappedAround() newPasswordTextField.tag = 0 checkingNewPasswordTextField.tag = 1 // 设置初始边框颜色与宽度(宽度必须大于0才会显示边框) newPasswordTextField.layer.borderColor = UIColor.lightGray.cgColor checkingNewPasswordTextField.layer.borderColor = UIColor.lightGray.cgColor newPasswordTextField.layer.borderWidth = 1.0 checkingNewPasswordTextField.layer.borderWidth = 1.0 // 绑定代理 newPasswordTextField.delegate = self checkingNewPasswordTextField.delegate = self configureNotificationObservers() }
3. 额外说明
- 这种方式直接通过系统代理监听编辑状态,和你当前
textColor自动变化的逻辑一致,都是直接操作TextField的属性,完全不需要刷新TableView; - 如果后续想通过ViewModel驱动状态,可以给ViewModel添加对应TextField的编辑状态属性(比如
isNewPasswordEditing),通过发布订阅的方式通知ViewController修改边框颜色,但当前场景下用代理方法更简洁高效; - 确保你的
RoundTextField没有在其他地方覆盖layer.borderColor属性,避免冲突。
内容的提问来源于stack exchange,提问作者eeuin
相关产品推荐
相关产品推荐

