2009-06-14 10 views
27

Utilizo el valor "Siguiente" para la "Tecla de retorno" para obtener el botón Siguiente en lugar del botón Listo, pero (obviamente) presionarlo no se mueve automáticamente al siguiente UITextField en mi opinión.La mejor manera de usar la versión "Siguiente" del botón Volver en UITextField para pasar al siguiente UITextField

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

+1

Para marcar una respuesta como correcta, simplemente haga clic en el icono de marca de verificación vacía junto a la respuesta ... .. –

Respuesta

36

Haga que un objeto sea el primer delegado del campo de texto e implemente el método - (BOOL)textFieldShouldReturn:(UITextField *)textField; en eso, llame al segundo campo de texto -becomeFirstResponder. Devolver YES de eso hará que el campo de texto realice su comportamiento predeterminado para el botón de retorno; creo que generalmente está enviando su mensaje de acción. Si no tiene agregado nada como objetivo de esa acción, realmente no importa lo que devuelva.

+1

.y si está en el último UITextField debe llamar a resignFirstResponder para ocultar el teclado. –

+0

es una forma totalmente diferente a la explicada aquí (http://stackoverflow.com/questions/467881/how-do-you-change-the-uicontrol-with-focus-on-iphone) o ambos funcionarán igual de bien ? – HollerTrain

+0

Cualquiera de los dos funcionará. Mi respuesta usa el sistema de delegación, Brad es el material de acción del objetivo. –

34

Para construir sobre la respuesta de Noé, si usted tiene una gran cantidad de campos de texto y no se siente como tener un montón de si de, usted podría 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 etiquetar cada campo de texto a partir de las cualquier número, siempre que estén etiquetados secuencialmente, en el guión gráfico o en el código, debería funcionar.

+0

¡Gran solución! Una sugerencia (menor) sugerida - prueba para viewWithTag == nil: 'UIView * view = [self.view viewWithTag: textField.tag + 1]; if (! View) [textField resignFirstResponder]; else [ver becomeFirstResponder]; ' – CharlesA

1

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

  • Todos los UITextFields deben estar en la misma UIView (tienen la misma supervista).
  • Los UITextFields deben estar en el orden correcto en el constructor de 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; 
    }  
    
0

He estado luchando con este problema también ... y como resultado he creado una pequeña biblioteca para el manejo de varios campos de texto. Puede encontrarlo en github GNKeyboardAwareScrollView#GNTextFieldsManager.

Puede inicializar con gran variedad de campos de texto:

NSArray *myTextFields = @[...]; // the order of array matters! 
GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithTextFields:myTextFields]; 

o especificando vista padre (y el establecimiento de etiquetas para todos los puntos de vista):

GNTextFieldsManager *manager = [[GNTextFieldsManager alloc] initWithView:self.view]; 

Espero ser útil para alguien:)

1

No me gusta tratar con la etiqueta así que aquí está mi solución. Cree un IBOutletCollection de todos sus textFields en su ViewController, arrastre para conectar sus textFields en orden de arriba hacia abajo.

@interface ViewController() <UITextFieldDelegate> 
@property (strong, nonatomic) IBOutletCollection(UITextField) NSArray *allTextFields; 
@end 

En viewDidLoad establezca su delegado textFields. (O configurarlo en el guión gráfico).

for (VVTextField *tf in self.allTextFields) { 
    tf.delegate = self; 
} 

luego implementar UITextField Delegado

#pragma mark - UITextField Delegate 

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    NSUInteger currentIndex = [self.allTextFields indexOfObject:textField]; 
    NSUInteger nextIndex = currentIndex+1; 
    if (nextIndex < self.allTextFields.count) { 
     [[self.allTextFields objectAtIndex:nextIndex] becomeFirstResponder]; 
    } else { 
     [[self.allTextFields objectAtIndex:currentIndex] resignFirstResponder]; 
    } 
    return YES; 
} 
+1

Esto puede funcionar pero no se garantiza que los objetos en su matriz' IBOutletCollection' estén en el orden correcto. – JAL

+0

@JAL Tiene un buen punto. Debería considerar editar su respuesta o asignar los valores de alguna forma. Esto puede causar un comportamiento inesperado. –

2

para SWIFT:

func textFieldShouldReturn(textField: UITextField) -> Bool { 
//your collection of textfields 
    guard let i = textFields.indexOf(textField) else { return false } 
    if i + 1 < textFields.count { 
     textFields[i + 1].becomeFirstResponder() 
     return true 
    } 
    textField.resignFirstResponder() 
    return true 
} 
Cuestiones relacionadas