如何根据 UITextField 禁用 UIAlertAction?

Wiz*_*zz 2 action uitextfield uialertview ios swift

我有一个在点击按钮时action创建一个alert

alert包括两个textfields和两个actionsadddismiss)。

add如果按钮textfields为空,是否有任何简单的方法可以禁用该按钮(稍后我将检查第二个是否真的是一个 URL,但让我们将重点放在action此处)?

这是我的代码以及到目前为止我尝试过的:

@IBAction func addSourceTapped(_ sender: Any) {

    let alert = UIAlertController(title: "Add a News Source", message: nil, preferredStyle: .alert)

    alert.addTextField { (textField) in
        textField.placeholder = "Name"
    }
    alert.addTextField { (textField) in
        textField.placeholder = "Link"
    }

    let name = alert.textFields!.first!.text!
    let link = alert.textFields!.last!.text!

    if name != "" && link != "" {
        alert.actions[0].isEnabled = true
    }

    let action = UIAlertAction(title: "Add", style: .default) { (_) in
        let name = alert.textFields!.first!.text!
        let link = alert.textFields!.last!.text!

        if name != "" && link != "" {

            alert.actions[0].isEnabled = true //doesn't do anything yet..

            if CoreDataHandler.saveSource(name: "\(name)", link: "\(link)") {
                for _ in CoreDataHandler.fetchSource()! {
                }
            }
        }


        self.tableView.reloadData()
    }

    let action2 = UIAlertAction(title: "Dismiss", style: .default)

    alert.addAction(action)
    alert.actions[0].isEnabled = false
    alert.addAction(action2)
    present(alert, animated: true, completion: nil)

}
Run Code Online (Sandbox Code Playgroud)

小智 6

您应该更好地使用操作,它比其他答案更简单。如果您尝试使用委托,则 didBeginEditing 和 didEndEditing 方法将无法正确处理它。shouldChangeCharactersIn 范围也不行,它在输入发生在文本字段之前执行,因此在那里检查文本字段的文本属性是不正确的。

private var action: UIAlertAction!

@IBAction func addSourceTapped(_ sender: Any) {

    ////////

    let alert = UIAlertController(title: "Add a News Source", message: nil, preferredStyle: .alert)

    alert.addTextField { (textField) in
        textField.placeholder = "Name"
        textField.addTarget(self, action: #selector(self.textFieldDidChange(_:)), for: .editingChanged) // <---
    }

    action = UIAlertAction(title: "Add", style: .default) { (_) in
        /////
    }
    action.isEnabled = false
    alert.addAction(action)

    ////////
}

@objc private func textFieldDidChange(_ field: UITextField) {
    action.isEnabled = field.text?.count ?? 0 > 0
}
Run Code Online (Sandbox Code Playgroud)