UITextField代表“shouldChangeCharactersIn”不用于文本字段中的第一项

问题描述:

我正在构建一个接受4位OTP的视图。我的代码如下所示UITextField代表“shouldChangeCharactersIn”不用于文本字段中的第一项

“的代码文本”是的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”委托方法,但当文本字段获得它的第二个条目时调用委托并且键盘正在被解雇。

因此,为了让键盘解散不必要的击键是必要的。

任何建议将是有益的

+0

你为什么不与'编辑Changed'尝试更多信息而不是'shouldChangeCharactersIn' –

替代选择,搭配出编码

  • Cretae IBAction
  • Ctrl-Click(或右键点击)界面生成器中的UITextField
  • 将“Editing Changed”事件连接到第一步中添加的文件所有者的IBAction。

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

,并得到输出

func updateContentsOfTextField(_ theTextField: UITextField) { 
print("text changed: \(theTextField.text)") 
} 

你可以从here

请使用通知

尝试的 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{ 
} 

当这m ethod得叫你可以调用textField.resignFirstResponder

对不起的OBJ-C,我复制这从我当前打开的文件THX

捕获文本字段的所有事件
+0

问题是方法本身没有被调用。在这种情况下改变条件将无济于事。感谢您的回复 – slysid

+0

我想你不会错过为最后一个'textfield'设置代理人 –

+0

当在文本框 – slysid