Swift中如何检测UITextField字符数以控制导航按钮与清除按钮显示
Swift实现文本框与Add按钮联动的简便方案
最优实现:监听editingChanged控制事件
无需实现UITextField代理,直接通过文本框的编辑变更事件触发逻辑,自动获取更新后的最新文本,避免了代理方法中需要手动计算替换后文本的繁琐步骤,代码更简洁不易出错:
- 首先在
viewDidLoad中给文本框添加事件监听:
// 系统自带的删除按钮无需自定义,初始设为不显示 titleTextField.clearButtonMode = .never // 初始状态Add按钮禁用 addButton.isEnabled = false // 添加编辑变更监听 titleTextField.addTarget(self, action: #selector(textFieldContentChanged), for: .editingChanged)
- 实现回调方法处理交互逻辑:
@objc private func textFieldContentChanged(_ textField: UITextField) { let isTextNotEmpty = !(textField.text?.isEmpty ?? true) addButton.isEnabled = isTextNotEmpty textField.clearButtonMode = isTextNotEmpty ? .whileEditing : .never }
其他可选简化方案
iOS 14+ 闭包回调方案
无需单独声明@objc方法,直接用UIAction闭包处理逻辑:
titleTextField.addAction(UIAction { [weak self] _ in guard let self = self else { return } let isTextNotEmpty = !(self.titleTextField.text?.isEmpty ?? true) self.addButton.isEnabled = isTextNotEmpty self.titleTextField.clearButtonMode = isTextNotEmpty ? .whileEditing : .never }, for: .editingChanged)
Combine响应式方案
适合已经接入Combine框架的项目:
import Combine // 类内声明可取消对象集合 private var cancellables = Set<AnyCancellable>() // viewDidLoad中绑定逻辑 titleTextField.publisher(for: \.text) .map { !($0?.isEmpty ?? true) } .sink { [weak self] hasText in self?.addButton.isEnabled = hasText self?.titleTextField.clearButtonMode = hasText ? .whileEditing : .never } .store(in: &cancellables)
内容的提问来源于stack exchange,提问作者Yuuu
相关产品推荐
相关产品推荐

