para formulario form estilos estilo editar darle centrar boton iphone

iphone - formulario - La mejor forma de usar la versión "Siguiente" del botón Volver en UITextField para pasar al siguiente UITextField



estilos contact form (6)

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

  • Todos los UITextFields deben estar en la misma UIView (tienen la misma supervisión).
  • Los UITextFields deben estar en el orden correcto en el generador de interfaces.

    -(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; }

Utilizo el valor "Siguiente" para la "Tecla de retorno" para colocar el botón Siguiente en lugar del botón Hecho, pero (obviamente) al presionarlo no se mueve automáticamente al siguiente campo de UITextF en mi vista.

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


No me gusta lidiar con la etiqueta, así que aquí está mi solución. Cree una IBOutletCollection de todos sus campos de texto en su ViewController , arrastre para conectar sus campos de texto en orden de arriba a abajo.

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

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

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

Luego implementa UITextField Delegate

#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; }


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 }


Para aprovechar la respuesta de Noah, si tiene muchos campos de texto y no tiene ganas de tener un montón de "si", 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 etiquetes todos los campos de texto que comienzan en cualquier número, siempre y cuando estén etiquetados secuencialmente, en el guión gráfico o en el código, debería funcionar.


También he estado luchando con este problema ... y como resultado he creado una pequeña biblioteca para manejar múltiples campos de texto. Puede encontrarlo en github GNKeyboardAwareScrollView#GNTextFieldsManager .

Puedes inicializarlo con una matriz de campos de texto:

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

O especificando la vista principal (y configurando etiquetas para todas las vistas):

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

Espero que sea útil para alguien :)


Convierta a algún objeto en 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 nada agregado como objetivo de esa acción, realmente no importa lo que devuelva.