ios ios6 uitextfield viewwillappear becomefirstresponder

En iOS 6,-[UITextField becomeFirstResponder] no funciona en-viewWillAppear:



ios6 (4)

En iOS 5.1 y iOS 5.0 funciona, pero en iOS 6.0 el teclado no se muestra.

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; UITextField *textField = self.emailAddressTextField; [textField becomeFirstResponder]; }

Por ahora moví la lógica a -viewDidAppear:

// This works but is not desirable. - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UITextField *textField = self.emailAddressTextField; [textField becomeFirstResponder]; }

Esto funciona, pero no es deseable. La animación de deslizamiento del teclado se muestra después de cargar la vista.

Quiero que el teclado esté presente cuando la animación de diapositiva a izquierda presenta la vista que se está cargando en el controlador de navegación.

¿Alguien sabe cómo cargar el teclado cuando aparece la vista en iOS 6?

actualizar

Basado en los comentarios de @Duck, hice un poco más de pruebas. Esto parece ser específico para UITextFields contenido en UITableViewCells.

¿Alguien tiene alguna sugerencia?

Primera solucion

Así que una descripción completa. Esta es una vista de tabla con dos celdas estáticas (correo electrónico y contraseña). Hay un botón de inicio de sesión en una vista que se asigna a la vista de pie de tabla. Las dos celdas tienen un campo de texto en ellas y son de un tipo personalizado SICOTextFieldCell.

Mi solución fue colocar un campo de texto falso detrás del botón de inicio de sesión (en la vista de pie de tabla).

- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; UITextField *textField = self.SICO_fakeTextField; [textField becomeFirstResponder]; } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UITextField *textField = self.SICO_emailAddressTextField; [textField becomeFirstResponder]; }

Nueva solucion

Basado en la respuesta de @stm, se me ocurrió una nueva solución (¿superior?).

Mi solución fue llamar a -selectRowAtIndexPath:animated:scrollPosition: -[SICOTextFieldCell setSelected:animated:] , que es una celda de vista de tabla personalizada, llama [self.textField becomeFirstResponder] que mágicamente dibuja el teclado correctamente. Sigue siendo un truco, pero es un truco más limpio.

@interface SICOLogInViewController () @property (readonly, nonatomic) UITextField *SICO_emailAddressTextField; @property (readonly, nonatomic) UITextField *SICO_passwordTextField; @end @implementation SICOLogInViewController - (IBAction)logIn { // Controller Details } #pragma mark Private - (UITextField *)SICO_textFieldForRowAtIndexPath:(NSIndexPath *)indexPath { SICOTextFieldCell *cell = (SICOTextFieldCell *)[self.tableView cellForRowAtIndexPath:indexPath]; return cell.textField; } #pragma mark View lifecycle - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop]; } #pragma mark UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { switch (textField.returnKeyType) { case UIReturnKeyGo: [self logIn]; break; case UIReturnKeyNext: [self.SICO_passwordTextField becomeFirstResponder]; break; default: break; } return YES; } #pragma mark Properties - (UITextField *)SICO_emailAddressTextField { return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; } - (UITextField *)SICO_passwordTextField { return [self SICO_textFieldForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]]; } @end


-viewWillAppear tal vez no se llama en iOS6? ¿Ha intentado poner su código en - (void)viewWillLayoutSubviews ?


Actualmente estoy escribiendo mi propio kit de formulario de entrada y luché unas horas con este problema. Después de descubrir que mi codificación estaba bien, encontré esta pregunta que apunta a una posible falla en iOS 6 y trabajé en una solución para esto.

Si tiene (o crea) un UITableViewCell personalizado, una solución fácil sería simplemente subclase - (vacío) layoutSubviews; y verifique si el UITextField de la celda debe ser el primer respondedor (es decir, verificando si el campo de texto es el mismo que el campo enfocado en su delegado). Si es así, simplemente llame a (BOOL) BecomeFirstResponder; en su UITextField (otra vez).

Esta es definitivamente una mejor solución que crear un UITextField "falso";)


Intenté exactamente su código, iOS6 y en viewWillAppear y pareció funcionar bien. ¿Está intentando corregir el hecho de que está intentando mostrar el teclado cuando empuja a una vista diferente?


Intente llamarlo en el método cellForRowAtIndexPath después de crear la celda, o en el viewWillAppear del tableViewCell que contiene ese textField.

Si eso te da el mismo resultado y aún quieres que el teclado aparezca antes, usaría un campo de texto "falso" para mostrar el teclado al principio. Supongo que su campo de texto no se ha agregado antes de que aparezca viewWillAppear.