ios - UITextField 委托(delegate) "shouldChangeCharactersIn"未调用文本字段中的第一个条目

标签 ios swift swift3 uitextfield uitextfielddelegate

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

"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”委托(delegate)方法但是当文本字段获得它的第二个条目时调用委托(delegate)并且键盘正在消失。

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

任何建议都会有帮助

最佳答案

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

  • Cretae a IBAction(在您当前的文本字段 VC 中)
  • 在 Interface Builder 中按住 Ctrl 并单击(或右键单击)UITextField
  • 将“编辑更改”事件连接到第一步中添加的文件所有者的 IBAction。

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

并在

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

您可以从here获得更多信息

关于ios - UITextField 委托(delegate) "shouldChangeCharactersIn"未调用文本字段中的第一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43157149/

相关文章:

iphone - Objective-C 属性

ios - 在自己的自定义类上处理 UIApplicationDelegate 回调而不是 AppDelegate 类

ios - Swift:以编程方式对齐不同 IOS 屏幕尺寸的标签

ios - WKWebView 可以播放受 fairplay/drm 保护的视频吗?

ios - 触摸文本框不起作用

swift - 减少 Swift 中括号的数量

swift - 如何检测应用程序是否被 ViewController 中的通知操作打开

swift - 在标准 View Controller 中更改 TableView 单元格

swift - 无法在 Swift X.0.2 中导入使用 swift X.1 编译的模块

iOS 13 上下文菜单 : how to simply dismiss menu by tapping on preview?