¿Cómo mover el cursor de un campo de text a otro automáticamente en swift ios mediante progtwigción?

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() } 

Estoy usando cuatro campos de text para la input OTP en los que solo se puede ingresar un número a la vez. Después de ingresar el número, necesito mover el cursor automáticamente al siguiente campo de text.

Establezca delegado de textField y agregue destino:

 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) } 

Ahora cuando los cambios de text cambian 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{ } } 

Y, por último, cuando el usuario comienza a editar clear textField

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

** Llame desde la function UITextfieldDelegate y haga que el siguiente campo de text sea el primer respondedor y no necesita agregar destino y recuerde establecer delegates de todos los campos de text en 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() } } 

He probado muchos códigos y, finalmente, esto funcionó para mí en Swift 3.0 Últimas [marzo de 2017]

La class "ViewController" debería haber henetworkingado el "UITextFieldDelegate" para que este código funcione.

 class ViewController: UIViewController,UITextFieldDelegate 

Agregue el campo de text con la label apropiada nuber y este número de label se usa para tomar el control en el campo de text apropiado basado en el número de label incremental asignado a él.

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

En el código anterior, el "returnKeyType = UIReturnKeyKeyType.next", donde hará que la tecla de retorno del keyboard se muestre como "Siguiente", también tendrá otras opciones como "Unir / Ir", etc. en function de su aplicación, cambiará los valores.

Este "textFieldShouldReturn" es un método controlado por UITextFieldDelegate y aquí tenemos la siguiente selección de campo basada en el incremento del valor de Tag

 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 } 

En primer lugar, tendremos que configurar la label para 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 } 

Nota: UITextField solo toma un carácter en formatting de número, que está en formatting OTP.

por veloz 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; }