Swift UITextField deleteBackward Issue

Tengo una serie de textfields de textfields en una sola fila. Cada campo de textfield está limitado a dos caracteres.

Mi problema es que quiero eliminar todos los caracteres y volver a recorrer todos los textfields hasta llegar al primer campo de textfield .

He subclasificado el campo de text y he anulado el método deleteBackward para determinar si el text en el campo de text está vacío. Si es así, cambie el respondedor al campo de text anterior.

Todo esto está bien, pero cuando hay un carácter en el campo de text y se presiona el retroceso, el carácter se elimina y el respondedor se cambia al campo de text anterior.

Esto es un comportamiento incorrecto ya que quiero que el foco permanezca en ese campo de text que ha tenido su carácter eliminado y si se presiona nuevamente la tecla Eliminar, entonces el respondedor debería cambiar al campo de text anterior.

Corrí este mi configuration de una bandera en el método delegado shouldChangeCharacters del campo de text. El indicador se establece en verdadero si …

 if (newLength == 0 && currentLength == 0) || currentLength == 0 { textFieldEmpty = true } else { textFieldEmpty = false } 

Esto funciona bien, pero cuando el campo de text está vacío y se presiona el retroceso, este método de delegado no se llama?

¿Solo deambulando si alguien ha resuelto un problema similar y qué enfoque pueden haber tomado?

Gracias

Tengo un escenario similar pero con caracteres únicos en cada campo de text. También he usado deleteBackward en un textField personalizado para lograr esto.

Prueba este código:

 import UIKit protocol CustomTextFieldDelegate{ func textFieldDidDelete() } class CustomTextField: UITextField { var myCustomTextFieldDelegate : CustomTextFieldDelegate! override func deleteBackward() { super.deleteBackward() myCustomTextFieldDelegate.textFieldDidDelete() } } 

Y así es como debes implementar el método deleteBackward:

 func textFieldDidDelete() { print("Entenetworking Delete"); print("Tag!!\(currentActiveTextField.tag)") var previousTag = 0 if currentActiveTextField.text == ""{ previousTag = currentActiveTextField.tag - 1 }else{ previousTag = currentActiveTextField.tag } let previousResponder = currentActiveTextField.superview?.viewWithTag(previousTag) if(previousTag > 0){ let previousTextField = previousResponder as! CustomTextField previousTextField.text = "" currentActiveTextField = previousTextField previousResponder?.becomeFirstResponder() } } 

También en el método shouldChangeCharacters en el range, no olvide configurar su ActiveActiveTextField como el campo de text que desea editar. Consulte el siguiente código, puede ser útil. Mis campos de text tienen tags 1,2,3,4.

 func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { currentActiveTextField = textField as! CustomTextField let nextTag = textField.tag + 1; // get next responder var nextResponder = textField.superview?.viewWithTag(nextTag); // On inputing value to textfield if (textField.text?.characters.count < 1 && string.characters.count > 0){ if (nextResponder == nil){ nextResponder = textField.superview?.viewWithTag(1); } textField.text = string; if nextTag == 5 { self.digitFourTextField.resignFirstResponder() return true; } nextResponder?.becomeFirstResponder(); return false; } if (textField.text?.characters.count >= 1 && string.characters.count == 0){ // on deleteing value from Textfield let presentTag = textField.tag; // get next responder var presentResponder = textField.superview?.viewWithTag(presentTag); if (presentResponder == nil){ presentResponder = textField.superview?.viewWithTag(1); } textField.text = ""; presentResponder?.becomeFirstResponder(); return false; } let currentCharacterCount = textField.text?.characters.count ?? 0 let newLength = currentCharacterCount + string.characters.count - range.length if newLength > 1 { textField.text = string if (nextResponder != nil){ nextResponder?.becomeFirstResponder(); } } let returnVal = newLength <= 1 return returnVal; }