Cambiar returnButton mientras se edita el keyboard se congela para 1 toque

Estoy haciendo una pantalla de inicio de session para mi aplicación y quiero que el button de retorno diga "Siguiente" cuando hay un campo que aún no se ha completado y debería decir "Ir" cuando se llenan todos los campos (estoy hablando UITextFields).

El código a continuación funciona bien porque muestra Siguiente e Ir en los momentos correctos. Pero siempre que cambie de "Siguiente" a "Ir", se ignorará el siguiente toque en el keyboard. Cuando dice "Ir" y vacio el campo de text por retroceso, no hay tal problema y muestra Siguiente como debería. Es casi como si el viejo keyboard todavía estuviera allí y se desvanezca después de haber sido tocado.

Mi pregunta es: ¿cuál es la fuente de este problema y, lo que es más importante, cómo me deshago de este congelamiento del keyboard?

UITextField *theSender = (UITextField *)sender; if (allTextFieldsAreFilled) { if (theSender.returnKeyType!=UIReturnKeyGo) { theSender.returnKeyType = UIReturnKeyGo; [theSender resignFirstResponder]; [theSender becomeFirstResponder]; } } else { if (theSender.returnKeyType!=UIReturnKeyNext) { theSender.returnKeyType = UIReturnKeyNext; [theSender resignFirstResponder]; [theSender becomeFirstResponder]; } } 

Este código se invoca cada vez que se cambia el valor de uno de los tres UITextFields, por lo que es una IBAction conectada al evento Editing Changed.

¡Gracias de antemano por tu ayuda!

EDITAR

Descubrí que esto solo ocurrirá si el campo de text se configura como seguro (contraseña). ¡Cuando no está configurado para asegurar, no se congelará y mi código funciona perfectamente! El problema es que el cambio al button "Ir" generalmente ocurrirá cuando un campo de text "seguro" es un respondedor de primer order. Entonces esto no cambia nada al problema.

Creé un nuevo proyecto de aplicación Single View para probar esto; y soltó el siguiente código en ViewController.m

 #import "ViewController.h" @interface ViewController () <UITextFieldDelegate> { @private IBOutlet UITextField* m_fieldA; IBOutlet UITextField* m_fieldB; IBOutlet UITextField* m_fieldC; } @end @implementation ViewController // connected to Editing Did Begin - (IBAction) onFocus:(UITextField*)_textField { [self updateKeyboardFor:_textField]; } // connected to Editing Changed - (IBAction) onChanged:(UITextField*)_textField { [self updateKeyboardFor:_textField]; } - (void) updateKeyboardFor:(UITextField*)_textField { bool allTextFieldsAreFilled = [m_fieldA.text length] && [m_fieldB.text length] && [m_fieldC.text length]; if (allTextFieldsAreFilled) { if (_textField.returnKeyType != UIReturnKeyGo) { _textField.returnKeyType = UIReturnKeyGo; //[_textField resignFirstResponder]; //[_textField becomeFirstResponder]; [_textField reloadInputViews]; } } else { if (_textField.returnKeyType != UIReturnKeyNext) { _textField.returnKeyType = UIReturnKeyNext; //[_textField resignFirstResponder]; //[_textField becomeFirstResponder]; [_textField reloadInputViews]; } } } // A part of UITextFieldDelegate - (BOOL) textFieldShouldReturn:(UITextField*)_textField { if (_textField.returnKeyType == UIReturnKeyGo) { [_textField resignFirstResponder]; // go off and perform 'go' } else { if(_textField == m_fieldA) [m_fieldB becomeFirstResponder]; if(_textField == m_fieldB) [m_fieldC becomeFirstResponder]; if(_textField == m_fieldC) [m_fieldA becomeFirstResponder]; } return true; } @end 

Luego en el XIB cree tres UITextFields y UITextFields a los IBOutlets , IBActions , y también configure este controller de vista como delegate para todos los campos.

Todo parece funcionar bien, independientemente de los campos seguros.

Mi conjetura es que su problema está en algún lugar del código en el que se mueve al campo "Siguiente"; y no en el código que publicaste. También asegúrese de que todos sus puntos de venta y delegates estén vinculados correctamente.


Actualización : he editado el código anterior. Las líneas comentadas fueron el problema, deberías usar reloadInputViews para actualizar el button.

Parece que no estaba bloqueando el keyboard; pero lo que estaba haciendo era después de escribir la primera letra y hacer la renuncia / convertirse en llamadas para actualizar el button, luego la segunda prensa sobrescribiría la primera. Esto parece un error en iOS … es más notable si después de la primera letra escribe un espacio. Cuando noté que agregué una label que actualizaba su contenido con el contenido del campo de contraseña y estaba aún más claro lo que estaba sucediendo.