You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何检测UITextField字符数以控制导航按钮与清除按钮显示

Swift实现文本框与Add按钮联动的简便方案

最优实现:监听editingChanged控制事件

无需实现UITextField代理,直接通过文本框的编辑变更事件触发逻辑,自动获取更新后的最新文本,避免了代理方法中需要手动计算替换后文本的繁琐步骤,代码更简洁不易出错:

  1. 首先在viewDidLoad中给文本框添加事件监听:
// 系统自带的删除按钮无需自定义,初始设为不显示
titleTextField.clearButtonMode = .never
// 初始状态Add按钮禁用
addButton.isEnabled = false
// 添加编辑变更监听
titleTextField.addTarget(self, action: #selector(textFieldContentChanged), for: .editingChanged)
  1. 实现回调方法处理交互逻辑:
@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:45:04