如何根据UITextField状态禁用UIAlertController中的添加按钮?
我来帮你搞定这个带动态禁用按钮的弹窗实现!下面是完整的解决方案,包含文本框实时校验、添加按钮动态启用/禁用的功能,还预留了后续URL验证的扩展位置:
实现带动态状态按钮的UIAlertController弹窗
核心思路
我们需要通过监听文本框的编辑事件,实时检查输入内容,动态控制「添加」按钮的启用状态。具体步骤如下:
- 创建UIAlertController并添加两个UITextField
- 为文本框绑定
editingChanged编辑事件监听 - 编写校验逻辑,判断文本框是否为空(后续可扩展URL验证)
- 根据校验结果更新「添加」按钮的
isEnabled属性
完整代码实现
@IBAction func addSourceTapped(_ sender: Any) { // 1. 创建弹窗实例 let alert = UIAlertController(title: "Add a News Source", message: nil, preferredStyle: .alert) // 2. 先定义添加按钮(初始状态设为禁用) var addAction: UIAlertAction! addAction = UIAlertAction(title: "添加", style: .default) { [weak self] _ in // 获取两个文本框的输入内容 guard let nameField = alert.textFields?.first, let urlField = alert.textFields?.last, let sourceName = nameField.text?.trimmingCharacters(in: .whitespacesAndNewlines), let sourceUrl = urlField.text?.trimmingCharacters(in: .whitespacesAndNewlines), !sourceName.isEmpty, !sourceUrl.isEmpty else { return } // 后续可在此处添加URL验证逻辑,比如: // if let validUrl = URL(string: sourceUrl), validUrl.scheme != nil { // // 执行添加操作 // } print("准备添加来源:\(sourceName),URL:\(sourceUrl)") } addAction.isEnabled = false // 3. 添加取消按钮 let cancelAction = UIAlertAction(title: "取消", style: .cancel) alert.addAction(cancelAction) alert.addAction(addAction) // 4. 添加第一个文本框(来源名称输入) alert.addTextField { textField in textField.placeholder = "输入来源名称" // 绑定编辑事件,触发校验 textField.addTarget(self, action: #selector(self.validateAlertInputs(_:)), for: .editingChanged) } // 5. 添加第二个文本框(来源URL输入) alert.addTextField { textField in textField.placeholder = "输入来源URL" textField.keyboardType = .URL // 绑定编辑事件,触发校验 textField.addTarget(self, action: #selector(self.validateAlertInputs(_:)), for: .editingChanged) } // 6. 弹出弹窗 present(alert, animated: true) } // MARK: - 文本框校验方法 @objc private func validateAlertInputs(_ sender: UITextField) { // 获取当前弹出的弹窗实例 guard let alert = presentedViewController as? UIAlertController, let nameField = alert.textFields?.first, let urlField = alert.textFields?.last, let addAction = alert.actions.first(where: { $0.title == "添加" }) else { return } // 校验逻辑:两个文本框都不为空(去除首尾空白后)时启用按钮 let isNameValid = !nameField.text?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? false let isUrlValid = !urlField.text?.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty ?? false // 后续扩展URL验证的话,可将isUrlValid替换为: // let isUrlValid = URL(string: urlField.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? "") != nil // 更新添加按钮的启用状态 addAction.isEnabled = isNameValid && isUrlValid }
关键细节说明
- 初始时将「添加」按钮设为
isEnabled = false,确保用户未输入有效内容时无法点击 - 给两个文本框都绑定
editingChanged事件,只要文本内容变化就触发校验 - 校验时使用
trimmingCharacters去除首尾空白字符,避免用户输入空格绕过校验 - 后续要做URL验证的话,直接替换
isUrlValid的判断逻辑即可,扩展性很强
内容的提问来源于stack exchange,提问作者Wizzardzz
相关产品推荐
相关产品推荐

