En iOS 6, – no funciona en -viewWillAppear:

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

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

Por ahora he movido 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 animation deslizante del keyboard se muestra una vez que se carga la vista.

Quiero que el keyboard esté presente, ya que la animation de diapositiva a izquierda presenta la vista cargada en el controller de navigation.

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

actualizar

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

¿Alguien tiene alguna sugerencia?

PRIMERA SOLUCIÓN

Entonces una descripción completa. Esta es una vista de tabla con dos celdas estáticas (correo electrónico y contraseña). Hay un button de inicio de session en una vista a la que se le asigna la vista del pie de página. Las dos celdas tienen un campo de text en ellas y tienen un tipo personalizado SICOTextFieldCell.

Mi solución fue colocar un campo de text falso detrás del button de inicio de session (en la vista del pie de página de la 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 SOLUCIÓN

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

Mi solución fue llamar -selectRowAtIndexPath:animated:scrollPosition: -[SICOTextFieldCell setSelected:animated:] , que es una celda de vista de tabla personalizada, llama [self.textField becomeFirstResponder] que mágicamente dibuja el keyboard correctamente. Todavía es 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 

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

Si eso te da el mismo resultado y todavía quieres que aparezca el keyboard antes, utilizaría un campo de text "falso" para mostrar el keyboard al principio. Mi conjetura es que su textField no se ha agregado antes de la vista WillAppear.

Probé su código exactamente, iOS6 y en viewWillAppear y parecía funcionar bien. ¿Estás tratando de que el keyboard ya se muestre cuando pases a una vista diferente?

Actualmente estoy escribiendo mi propio Kit de formularios de input y he tenido algunas dificultades con este problema. Después de descubrir que mi encoding estaba bien, encontré esta pregunta apuntando a una posible falla en iOS 6 y trabajé en una solución para esto.

Si tienes (o crees) un UITableViewCell personalizado, una solución fácil sería simplemente una subclass – (void) layoutSubviews; y verifique si UITextField de la celda debe ser el primer respondedor (es decir, verificando si el campo de text es el mismo que el campo enfocado establecido en su delegado). Si es así, simplemente llame – (BOOL) becomeFirstResponder; en tu UITextField (nuevamente).

Definitivamente, esta es una solución mejor que crear un "falso" UITextField;)

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