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

如何根据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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:07:51