UITextField委托“shouldChangeCharactersIn”未在textfield中调用第一个条目

时间:2017-04-01 12:55:24

标签: ios swift swift3 uitextfield uitextfielddelegate

我正在构建一个接受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”获得它的焦点并获得它的第一个条目但是当textfield获得它的第二个条目时调用委托时,不会调用“shouldChange”委托方法键盘正在被解雇。

因此,为了让键盘被解雇,需要进行不必要的击键。

任何建议都会有所帮助

2 个答案:

答案 0 :(得分:2)

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

  • 创建IBAction(在当前文本域VC中)
  • 在Interface Builder
  • 中的UITextField上按住Ctrl键单击(或右键单击)
  • 连接"编辑已更改"在第一步中添加了文件所有者的IBAction事件。

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

并在

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

您可以从here

获取更多信息

答案 1 :(得分:0)

请尝试使用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

复制了这个