2012-02-10 21 views
29

Tengo una aplicación para iPad que tiene un formulario de registro dentro de ella. La forma es muy básica y contiene solo dos UITextFields que son para el nombre & Dirección de correo electrónico.Pasando al siguiente UITextField cuando se toca 'Siguiente'

El primer campo de texto es para el nombre de los candidatos, cuando ingresan su nombre y presionan 'Siguiente' en el teclado, quiero que este pase automáticamente al siguiente campo de texto de dirección de correo electrónico para editar.

¿Alguna idea de cómo puedo configurar el siguiente botón para pasar al siguiente teclado?

Gracias

Respuesta

72

Es necesario para que su controlador de vista del delegado UITextField, y poner en práctica el método delegado UITextField:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    if (textField == nameField) { 
     [textField resignFirstResponder]; 
     [emailField becomeFirstResponder]; 
    } else if (textField == emailField) { 
     // here you can define what happens 
     // when user presses return on the email field 
    } 
    return YES; 
} 

versión Swift:

func textFieldShouldReturn(textField: UITextField) -> Bool { 
    if textField == nameField { 
     textField.resignFirstResponder() 
     emailField.becomeFirstResponder() 
    } else if textField == emailField { 
     // here you can define what happens 
     // when user presses return on the email field 
    } 
    return true 
} 

También puede para desplazar su vista para que el campo emailFire se vuelva visible. Si su controlador de vista es una instancia de UITableViewController, esto debería suceder automáticamente. De lo contrario, debe leer this Apple document, especialmente Contenido móvil que se encuentra debajo del teclado parte.

+0

Gracias lawicko. El código funcionó perfectamente con el campo de texto del correo electrónico establecido en [email resignFirstResponder] ;. Gracias de nuevo. –

+3

@lawicko La declaración '[textField resignFirstResponder];' en su código anterior no es importante. Mientras todavía hay campos en el formulario, simplemente mueve el 'becomeFirstResponder' al siguiente campo:' [emailField becomeFirstResponder]; ' – Malloc

+0

@Malloc Tienes razón, para los casos simples en que' textField' no es una subclase del UITextField y no hace nada específico cuando se abandona el estado del primer respondedor. Sin embargo, mi código funciona bien en todos los casos, incluidos los más complicados. Consulte [aquí] (http://developer.apple.com/library/ios/documentation/uikit/reference/UIResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/UIResponder/resignFirstResponder) para saber por qué ' resighFirstResponder' puede ser anulado. – lawicko

10

Adicionalmente a la respuesta @lawicko 's que suelen cambiar el texto del botón para darle ese toque final de acabado (por ejemplo, dice next cuando hay más campos y luego done cuando en el pasado):

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    BOOL isLastTextField = //.. your logic to figure out if the current text field is the last 

    if (isLastTextField) { 
     textField.returnKeyType = UIReturnKeyDone; 
    } else { 
     textField.returnKeyType = UIReturnKeyNext; 
    } 
} 
0
- (BOOL) textFieldShouldReturn:(UITextField *)textField 
{ 
    if (textField == self.textFieldName) 
    { 
     [self.textFieldName resignFirstResponder]; 
     [self.textFieldPassword becomeFirstResponder]; 
    } 
    else if (textField == self.textFieldPassword) 
    { 
     [self.textFieldPassword resignFirstResponder]; 

     [self login:self]; 
    } 

    return true; 
} 




@interface MLLoginViewController()<UITextFieldDelegate> 

@end 

@implementation MLLoginViewController 



- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.textFieldName.delegate = self; 
    self.textFieldPassword.delegate = self; 
0

Hacer una salida para el campo de texto y, a continuación

viewController.h

(IBAction)textFieldDoneEditing:(id)sender; 

viewController.m

(IBAction)textFieldDoneEditing:(id)sender { 
    [textField resignFirstResponder]; 
    if (textField == nameField) { 
     [emailField becomeFirstResponder]; 
    } 
} 

Hacer la relación entre (mostrar el inspector de conexiones> Eventos enviados) didEndOnExit y textFieldDoneEditing

5

Una forma más coherente y sólida es utilizar NextResponderTextField Puede configurar es totalmente del constructor de interfaz.

Todo lo que necesita hacer es

  1. Establecer el tipo de clase de su UITextField ser NextResponderTextField enter image description here
  2. asentando después la salida de la nextResponderField para que apunte a la siguiente respuesta puede ser cualquier cosa UITextField o cualquier subclase UIResponder. También puede ser un UIButton y la biblioteca es lo suficientemente inteligente como para activar el evento TouchUpInside del botón solo si está habilitado. enter image description here enter image description here

Aquí está la biblioteca en acción:

enter image description here

+0

Exactamente lo que estoy buscando, ¡gracias! –

8

versión de Swift respuesta correcta.

En mi experiencia, no es necesario que resignFirstResponder al cambiar textFields.

En este ejemplo, es solo su nombre de usuario y contraseña básicos textFields.

El teclado "devolver clave" en el guión gráfico para nombre de usuario se establece en "Siguiente" y el de contraseña se establece en "Hecho".

enter image description here

Entonces sólo tiene que conectar a los delegados por estos dos campos de texto y añadir a la extensión y que está bastante hecho.

extension LoginViewController: UITextFieldDelegate { 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     if textField == textFieldPassword { 
      self.view.endEditing(true) 
     } else { 
      textFieldPassword.becomeFirstResponder() 
     } 
     return true 
    } 

} 
Cuestiones relacionadas