UITextField 委托方法不会被触发

Posted

技术标签:

【中文标题】UITextField 委托方法不会被触发【英文标题】:UITextField Delegate method doesn't get triggered 【发布时间】:2020-08-07 13:41:41 【问题描述】:

我正在尝试将用户可以输入的字符数限制为 1。

 class ActivationViewController: UIViewController , UITextFieldDelegate

    @IBOutlet weak var activationCodeTextField1: UITextField!


    override func viewDidLoad() 
          super.viewDidLoad()
          self.activationCodeTextField1.addTarget(self, action: #selector(self.textField1DidChange(_:)), for: UIControl.Event.editingChanged)
            self.activationCodeTextField1.delegate = self
     

     @IBAction func textField1DidChange(_ sender: AnyObject) 
         print("TextField1DidChange")
         
         

    
    func activationCodeTextField1(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool 
        // You can check for other things besides length here as well.
        print("isValidLength: ", isValidLength(textField: activationCodeTextField1, range: range, string: string))
        return isValidLength(textField: activationCodeTextField1, range: range, string: string)
    

    private func isValidLength(textField: UITextField, range: NSRange, string: String) -> Bool 
        let length = ((textField.text ?? "").utf16).count + (string.utf16).count - range.length
        return length <= 1
    
    

但是,函数activationCodeTextField1 没有被触发,并且其中的这一行不打印任何内容:

print("isValidLength: ", isValidLength(textField: activationCodeTextField1, range: range, string: string))

知道我做错了什么吗?

【问题讨论】:

【参考方案1】:

您不能更改委托方法的名称。正确的函数是

optional func textField(_ textField: UITextField, 
shouldChangeCharactersIn range: NSRange, 
      replacementString string: String) -> Bool

Documentation

【讨论】:

问题是我有多个文本字段。 然后检查哪个文本字段调用了委托。 if textField == activationCodeTextField1 虽然你有多个文本字段,但这个方法只有在你为自己分配一个委托时才会调用。您还可以比较文本字段。【参考方案2】:

您还没有从 UITextFieldDelegate 协议中调用任何方法。请查看链接以查找 UITextFieldDelegate 协议中的方法。

https://developer.apple.com/documentation/uikit/uitextfielddelegate

【讨论】:

以上是关于UITextField 委托方法不会被触发的主要内容,如果未能解决你的问题,请参考以下文章

将 UITextField 添加到 UITableViewCell

UITextField 的子类

UIButton没有得到关注

自定义 UITextField 委托方法 shouldChangeCharactersIn 没有被调用

哪个 UITextField 委托方法将被调用而无需重新设置键盘?

如何检测 UITextField 上的点击?