UIAlertController的textfield委托不会被调用

时间:2014-07-20 17:07:15

标签: uitextfield swift uitextfielddelegate uialertcontroller

我已将UITextField添加到UIAlertController,但shouldChangeCharactersInRange将不会被触发。为什么?我设置了代表。

let alertController = UIAlertController(title: "", message: "xxx", preferredStyle: .Alert)

            self.presentViewController(alertController, animated:true, completion:nil)
            let textField = UITextField()
            textField.delegate = self
            alertController.addTextFieldWithConfigurationHandler(nil)

并且在同一个班级中,代表:

func textField(textField: UITextField!,
    shouldChangeCharactersInRange range: NSRange,
    replacementString string: String!) -> Bool {

2 个答案:

答案 0 :(得分:10)

您为其设置委托的文本字段与添加到警报控制器的文本字段不同。基本上,您正在创建UITextField的新实例,但从不给它一个框架,或将其添加到视图层次结构中。同时,您使用addTextFieldWithConfigurationHandler()向警报控制器添加文本字段,但您从未为此文本字段设置委托。我相信这就是你想要的:

let alertController = UIAlertController(title: "", message: "xxx", preferredStyle: .Alert)

alertController.addTextFieldWithConfigurationHandler {[weak self] (textField: UITextField!) in
    textField.delegate = self
}

self.presentViewController(alertController, animated:true, completion:nil)

答案 1 :(得分:0)

我无法与UITextFieldDelegate一起使用。委托已正确设置,但未在UIAlertController中为UITextField调用。

根据这里的答案How do I validate TextFields in an UIAlertController?,我了解到您可以在编辑更改时改为使用addTargetUIControl.Event.editingChanged来调用选择器。

let alertController = UIAlertController(title: "Title", message: "message", preferredStyle: .alert)

alertController.addTextField { (textField : UITextField!) -> Void in

    /*
     * Alternative to UITextFieldDelegate
     */
    textField.addTarget(alertController, action: #selector(alertController.textDidChange), for: .editingChanged)
}

let searchAction = UIAlertAction(title: "Search", style: .default)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil )

alertController.addAction(searchAction)
alertController.addAction(cancelAction)

present(searchAlertController, animated: true)

您可以扩展或继承UIAlertController来添加选择器:

extension UIAlertController {

    @objc func textDidChange() {
        guard let textField = textFields?.first else { return }
        guard let searchAction = actions.first(where: { $0.title == "Search" }) else { return }
        let text = textField.text?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
        searchAction.isEnabled = !text.isEmpty
    }

}