Hay una solución mucho más elegante que me sorprendió la primera vez que la vi. Beneficios:
- Más cerca de la implementación del campo de texto OSX, donde un campo de texto sabe a dónde debe ir el foco.
- No se basa en la configuración o el uso de etiquetas, que son IMO frágiles para este caso de uso
- Se puede extender para trabajar con ambos
UITextField
yUITextView
controles - o cualquier entrada de control de la interfaz de usuario del teclado
- No abarrota su controlador de vista con código de delegado UITextField repetitivo
- Se integra muy bien con IB y se puede configurar a través de la opción familiar de arrastrar y soltar para conectar salidas.
Cree una subclase UITextField que tenga una IBOutlet
propiedad llamada nextField. Aquí está el encabezado:
@interface SOTextField : UITextField
@property (weak, nonatomic) IBOutlet UITextField *nextField;
@end
Y aquí está la implementación:
@implementation SOTextField
@end
En su controlador de vista, creará el -textFieldShouldReturn:
método delegado:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if ([textField isKindOfClass:[SOTextField class]]) {
UITextField *nextField = [(SOTextField *)textField nextField];
if (nextField) {
dispatch_async(dispatch_get_current_queue(), ^{
[nextField becomeFirstResponder];
});
}
else {
[textField resignFirstResponder];
}
}
return YES;
}
En IB, cambie sus UITextFields para usar la SOTextField
clase. A continuación, también en IB, configure el delegado para cada uno de los 'SOTextFields' al 'Propietario del archivo' (que es justo donde coloca el código para el método de delegado: textFieldShouldReturn). La belleza de este diseño es que ahora puede simplemente hacer clic derecho en cualquier campo de texto y asignar la salida nextField al siguiente SOTextField
objeto que desea que sea el próximo respondedor.
Además, puede hacer cosas geniales como recorrer los campos de texto para que después de que el último pierda el foco, el primero reciba el foco nuevamente.
Esto se puede extender fácilmente para asignar automáticamente el returnKeyType
de SOTextField
a UIReturnKeyNext
si hay un nextField asignado, una cosa menos se configura manualmente.