2012-05-09 22 views
5

Estoy haciendo una pantalla de inicio de sesión para mi aplicación y quiero que el botón de retorno diga "Siguiente" cuando hay un campo que aún no está completo y debería decir "Ir "cuando todos los campos están llenos (estoy hablando de UITextFields).Cambiar returnButton mientras edita congela el teclado por 1 toque

El siguiente código funciona bien porque muestra Next y Go en los momentos correctos. Pero cada vez que cambia de "Siguiente" a "Ir", se ignora el siguiente toque en el teclado. Cuando dice "Ir" y yo vacía el campo de texto retrocediendo, no hay tal problema y muestra Siguiente como debería. Es casi como si el teclado viejo todavía estuviera allí y se desvaneciera después de haberlo pulsado.

Mi pregunta es: ¿cuál es la fuente de este problema y, más importante aún, cómo me deshago de este bloqueo del teclado?

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 llama cada vez que se cambia el valor de una de las tres UITextFields, por lo que es un IBAction conectados al acontecimiento cambió edición.

Gracias de antemano por su ayuda!

EDITAR

descubrí esto sólo ocurrirá si el campo de texto se establece 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 botón "Ir" generalmente ocurrirá cuando un campo de texto 'seguro' es el primer respondedor. Entonces esto no cambia nada al problema.

Respuesta

1

Creé un nuevo Single View Aplicación proyecto para probar esto; y dejó caer el siguiente código en el 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 XI ter crear tres UITextFields y los conectó a la IBOutlets, IBActions, y también establecer este punto de vista controlador ya que el delegate para todos los campos.

Todo parece funcionar bien independientemente de los campos seguros.

Supongo que su problema está en algún lugar del código donde 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 delegados estén conectados correctamente.


actualización: He editado el código de seguridad. Las líneas comentadas fueron el problema, debe usar reloadInputViews para actualizar el botón.

Parece que no estaba bloqueando el teclado; pero lo que hacía era después de que escribiste la primera letra e hiciste las llamadas para renunciar/volver a actualizar el botón, luego la segunda vez sobrescribía la primera. Esto parece un error en iOS ... es más notable si después de la primera letra escribes un espacio. Cuando me di cuenta de que agregué una etiqueta que actualizaba su contenido con el contenido del campo de contraseña, estaba aún más claro lo que estaba sucediendo.

+0

Es extraño, verifico mi código contra el tuyo. – Manuel

+0

He copiado tu código pero no se detendrá. – Manuel

+0

Hmm; Debe haber algo más. ¿Qué SDK, iOS y dispositivo estás usando? ¿Intentó hacer un nuevo proyecto para probarlo? ¿O simplemente usando tu actual? – Wex

Cuestiones relacionadas