UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用

Posted

技术标签:

【中文标题】UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用【英文标题】:UITextField Delegate "shouldChangeCharactersIn" not called for first entry in textfield 【发布时间】:2017-04-01 12:55:24 【问题描述】:

我正在构建一个接受 4 位 OTP 的视图。我的代码如下

“CodeText”是 UITextField 的子类

    class RegisterController: ModelController, UITextFieldDelegate 

    @IBOutlet var firstDigit:CodeText?
    @IBOutlet var secondDigit:CodeText?
    @IBOutlet var thirdDigit:CodeText?
    @IBOutlet var fourthDigit:CodeText?

    override func viewDidLoad() 
        super.viewDidLoad()

        self.navigationItem.hidesBackButton = true
        self.firstDigit!.delegate = self
        self.secondDigit!.delegate = self
        self.thirdDigit!.delegate = self
        self.fourthDigit!.delegate = self

        self.firstDigit!.becomeFirstResponder()
    


    // UITextField Delegate Methods

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


        if (textField == self.firstDigit) 

            if(textField.text!.characters.count >= 1 ) 

                self.secondDigit?.becomeFirstResponder()
            
        
        else if (textField == secondDigit) 

            if(textField.text!.characters.count >= 1 ) 

                self.thirdDigit?.becomeFirstResponder()
            

        
        else if (textField == thirdDigit) 

            if(textField.text!.characters.count >= 1 ) 

                self.fourthDigit?.becomeFirstResponder()
            
        
        else if (textField == fourthDigit) 

            print("Fourth Digit")

            if(textField.text!.characters.count >= 1 ) 

                self.fourthDigit?.resignFirstResponder()
            
        

        return true
    

上面的代码对我来说很好,除了一个功能。我希望在输入第四位数字后关闭键盘,但是发生的情况是当“fourthDigit”获得焦点并获得它的第一个条目时不调用“shouldChange”委托方法,但是当文本字段获得它的第二个条目时调用委托并且键盘被关闭了。

因此,为了消除键盘,需要进行不必要的击键。

任何建议都会有所帮助

【问题讨论】:

为什么不尝试使用Editing Changed 而不是shouldChangeCharactersIn 【参考方案1】:

捕获文本字段的所有事件的替代选择,无需编码

创建一个 IBAction(在您的当前文本字段 VC 中) 在 Interface Builder 中的 UITextField 上按住 Ctrl 并单击(或右键单击) 将“Editing Changed”事件连接到第一步添加的文件所有者的 IBAction。

例如,您的 UIControlEventEditingChanged 方法名称是 updateContentsOfTextField

并在

中获取输出
func updateContentsOfTextField(_ theTextField: UITextField) 
print("text changed: \(theTextField.text)")

您可以从here获取更多信息

【讨论】:

【参考方案2】:

请尝试string.length>0 而不是textField.text!.characters.count >= 1

编辑

当用户使用通知在textfield 中输入字符时,我已经设法获得回调

// in your respective method where you init your text field
[_txtSearchLocation addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChange :(UITextField *) textField

当这个方法被调用时,你可以调用textField.resignFirstResponder

对不起 Obj-c,我从当前打开的文件中复制了这个 thx

【讨论】:

问题是方法本身没有被调用。在这种情况下,改变条件将无济于事。感谢您的回复 我猜你不会错过你最后一个textfield的设置委托 在文本字段中输入第二个条目时,已设置委托并调用方法

以上是关于UITextField 委托“shouldChangeCharactersIn”不为文本字段中的第一个条目调用的主要内容,如果未能解决你的问题,请参考以下文章

UITextfield 类快速调用委托方法

UITextField 委托方法不会被触发

UITextField 委托返回多个文本字段

用委托识别特定的 UITextField

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

具有多个委托的 UITextfield