如何观察用户在 UIAlertController 中编辑文本字段?

How do I observe user editing a textField in an UIAlertController?

我有一个 UIAlertController 和一个 textField。由于我无法为 textField 创建出口,因此我必须找到另一种方法来获得实时观察用户输入的功能。

我做了一些尝试,但没有成功。该线程解释了如何将目标添加到文本字段:

textfield.addTarget(self, action: #selector(ViewControllerr.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

我试过了,但不太理解 #selector 输入。它想要我的 UIViewController? 还是我的 UIAlertController 我都试过了但是得到了相同的错误信息:

Value of type 'UIViewController' has no member 'textFieldDidChange'

UIAlertController相同。

我还尝试将我的 textField 设置为委托访问 class:

的功能
textField.delegate = self as? UITextFieldDelegate

但我想这不是正确的方法,因为我仍然无法访问任何功能,除非执行以下操作:

textField.delegate?.textFieldDidBeginEditing?(textField)

但这也没有给我任何东西。

我也试过添加这样的扩展:

extension UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        print("EDITING")
}// became first responder

    func textFieldDidEndEditing(_ textField: UITextField) {
        print("EDITING")
    }
}

但由于某些原因我无法通过 textView

访问它们

如果我像这样扩展 class:

extension PickNumberViewController: UITextFieldDelegate {...}

我收到相同的错误消息

Value of type 'UITextField' has no member 'textFieldDel...'

这没有意义,因为我将 textField 设置为 UITextFieldDelegate 而不是 UITextField

如果你也想看我的代码,请告诉我。

您可以尝试通过 self.textF = alert.textFields?[0]

获取对它的引用
class ViewController: UIViewController {

    var textF:UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {

            //1. Create the alert controller.
            let alert = UIAlertController(title: "Some Title", message: "Enter a text", preferredStyle: .alert)
            alert.addTextField { (textField) in
                textField.text = "Some default text"
            }
             let tex = alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { [weak alert] (_) in

            })) 
            // 4. Present the alert.
            self.present(alert, animated: true, completion: nil)

            self.textF =  alert.textFields?[0]

            self.textF.addTarget(self, action: #selector(self.textFieldDidChange), for: UIControl.Event.editingChanged)

        }


    }

    @objc func textFieldDidChange() {
        print(textF.text)
    }

}

您不需要保留对文本字段的引用。您可以像这样在 addTextField 闭包中添加目标或设置委托。

class ViewController: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
        alert.addTextField { textField in
            textField.delegate = self
            textField.addTarget(self, action: #selector(self.textChanged(_:)), for: .editingChanged)
            textField.placeholder = "Enter name"
        }
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
        present(alert, animated: true, completion: nil)
    }
    @objc func textChanged(_ sender: UITextField) {
        print("Text changed - ", sender.text!)
    }
}
extension ViewController: UITextFieldDelegate {
    func textFieldDidBeginEditing(_ textField: UITextField) {
        print("EDITING")
    }
    func textFieldDidEndEditing(_ textField: UITextField) {
        print("EDITING")
    }
}