如何将光标从一个文本字段自动移动到另一个编程的Swift ios?

func textFieldDidBeginEditing(textField: UITextField) { scrlView.setContentOffset(CGPointMake(0, textField.frame.origin.y-70), animated: true) if(textField == firstDigit){ textField.becomeFirstResponder() secondDigit.resignFirstResponder() } else if(textField == secondDigit){ textField.becomeFirstResponder() thirdDigit.resignFirstResponder() } else if(textField == thirdDigit){ //textField.becomeFirstResponder() fourthDigit.becomeFirstResponder() } 

我使用四个文本框来input一次只能input一个数字的OTP。 input数字后,我需要将光标自动移动到下一个文本框。

设置textField委托并添加目标:

 override func viewDidLoad() { super.viewDidLoad() first.delegate = self second.delegate = self third.delegate = self fourth.delegate = self first.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) second.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) third.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) fourth.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged) } 

现在当文字改变textField

 func textFieldDidChange(textField: UITextField){ let text = textField.text if text?.utf16.count >= 1{ switch textField{ case first: second.becomeFirstResponder() case second: third.becomeFirstResponder() case third: fourth.becomeFirstResponder() case fourth: fourth.resignFirstResponder() default: break } }else{ } } 

最后,当用户开始编辑清除文本字段

 extension ViewController: UITextFieldDelegate{ func textFieldDidBeginEditing(textField: UITextField) { textField.text = "" } } 

**从UITextfieldDelegate函数调用并使下一个文本字段成为第一响应者,并且不需要添加目标,并且记住在viewDidLoad **中设置所有文本字段的委托

  extension ViewController : UITextFieldDelegate { func textFieldShouldReturn(textField: UITextField) -> Bool { nextTextFieldToFirstResponder(textField) return true; } func nextTextFieldToFirstResponder(textField: UITextField) { if textField == emailTextField { self.firstNameTextField.becomeFirstResponder() } else if textField == firstNameTextField { self.lastNameTextField.becomeFirstResponder() } else if textField == lastNameTextField { self.passwordTextField.becomeFirstResponder() } else if textField == passwordTextField { self.confirmPassTextField.becomeFirstResponder() } else if textField == confirmPassTextField { self.confirmPassTextField.resignFirstResponder() } } 

我已经尝试了很多代码,最后这在Swift 3.0中为我工作最新[2017年3月]

“ViewController”类应该inheritance“UITextFieldDelegate”来使这个代码工作。

 class ViewController: UIViewController,UITextFieldDelegate 

添加文本字段与正确的标签nuber和这个标签号码是用来采取控制适当的文本字段基于增量标签号分配给它。

 override func viewDidLoad() { userNameTextField.delegate = self userNameTextField.tag = 0 userNameTextField.returnKeyType = UIReturnKeyType.next passwordTextField.delegate = self passwordTextField.tag = 1 passwordTextField.returnKeyType = UIReturnKeyType.go } 

在上面的代码中,“returnKeyType = UIReturnKeyType.next”在哪里将使键盘返回键显示为“下一步”,你也有其他select作为“join/去”等,根据您的应用程序更改值。

这个“textFieldShouldReturn”是UITextFieldDelegate控制的方法,在这里我们有下一个字段select基于标记值增量

 func textFieldShouldReturn(_ textField: UITextField) -> Bool { if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField { nextField.becomeFirstResponder() } else { textField.resignFirstResponder() return true; } return false } 

首先,我们需要为UITextField设置标签;

 func textFieldShouldReturnSingle(_ textField: UITextField , newString : String) { let nextTag: Int = textField.tag + 1 let nextResponder: UIResponder? = textField.superview?.superview?.viewWithTag(nextTag) textField.text = newString if let nextR = nextResponder { // Found next responder, so set it. nextR.becomeFirstResponder() } else { // Not found, so remove keyboard. textField.resignFirstResponder() } } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let newString = ((textField.text)! as NSString).replacingCharacters(in: range, with: string) let newLength = newString.characters.count if newLength == 1 { textFieldShouldReturnSingle(textField , newString : newString) return false } return true } 

注意:UITextField只有一个数字格式的字符,它是OTP格式的。

为迅速3

  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { // On inputing value to textfield if ((textField.text?.characters.count)! < 1 && string.characters.count > 0){ let nextTag = textField.tag + 1; // get next responder let nextResponder = textField.superview?.viewWithTag(nextTag); textField.text = string; if (nextResponder == nil){ textField.resignFirstResponder() } nextResponder?.becomeFirstResponder(); return false; } else if ((textField.text?.characters.count)! >= 1 && string.characters.count == 0){ // on deleting value from Textfield let previousTag = textField.tag - 1; // get next responder var previousResponder = textField.superview?.viewWithTag(previousTag); if (previousResponder == nil){ previousResponder = textField.superview?.viewWithTag(1); } textField.text = ""; previousResponder?.becomeFirstResponder(); return false; } return true; }