27 votos

Mejor manera de utilizar la versión "Next" del botón Return en UITextField para pasar al siguiente UITextField

Utilizo el valor "Next" para la "Tecla Return" para obtener el botón Next en lugar del botón Done, pero (obviamente) al presionarlo no se mueve automáticamente al siguiente UITextField en mi vista.

¿Cuál es la forma correcta de hacerlo? En un tema más amplio, ¿cuáles son algunos consejos para construir correctamente los formularios en el iPhone SDK?

36voto

Noah Witherspoon Puntos 35239

Haz que algún objeto sea el delegado del primer campo de texto, e implementa la función - (BOOL)textFieldShouldReturn:(UITextField *)textField en el que se llama al método -becomeFirstResponder . Volviendo a YES de que hará que el campo de texto realizar su comportamiento por defecto para el botón de retorno - Creo que es generalmente el envío de su mensaje de acción. Si no tiene nada añadido como objetivo de esa acción, no importa realmente lo que devuelve.

34voto

Philippe Sabourin Puntos 4957

Para ampliar la respuesta de Noah, si tienes muchos campos de texto y no te apetece tener un montón de if's, podrías hacerlo de esta manera:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    //[[self.view viewWithTag:textField.tag+1] becomeFirstResponder];

    UIView *view = [self.view viewWithTag:textField.tag + 1];     
    if (!view)         
          [textField resignFirstResponder];     
    else         
          [view becomeFirstResponder];
    return YES;
}

Una vez que se etiquetan todos los campos de texto a partir de cualquier número, siempre que se etiqueten secuencialmente, en el storyboard o en el código, debería funcionar.

1voto

Weeman360 Puntos 1

Esto parece funcionar bastante bien y no requiere el sistema de etiquetas que muchos sugieren. Sin embargo, hay que tener en cuenta dos cosas con esta solución:

  • Todos los UITextFields deben estar en el mismo UIView (tener la misma supervista).
  • Los UITextFields deben estar en el orden correcto en el constructor de la interfaz.

    -(BOOL)textFieldShouldReturn:(UITextField *)textField    {
       /*
       *  1. Loop through the textfield's superview
       *  2. Get the next textfield in the superview  
       *  3. Focus that textfield
       */
    
       UIView *superView = [textField superview];
       BOOL foundCurrent = false;
       for (UITextField *tf in superView.subviews) {
          // Set focus on the next textfield
          if (foundCurrent) {
             [tf becomeFirstResponder];
             return NO;
          }
    
         //Find current textfield
         if ([tf isEqual:textField]) {
             foundCurrent = true;
          }
       }
    
       return YES;
    }

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X