Nota:
Vea la respuesta aceptada (no la más votada) para la solución a partir de iOS 4.3.
Esta pregunta es sobre un comportamiento descubierto en el teclado del iPad, donde se niega a ser descartado si se muestra en un diálogo modal con un controlador de navegación.
Básicamente, si presento el controlador de navegación con la siguiente línea de la siguiente manera:
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
El teclado se niega a ser descartado. Si comento esta línea, el teclado desaparece bien.
...
Tengo dos campos de texto, nombre de usuario y contraseña; el nombre de usuario tiene un botón Siguiente y la contraseña tiene un botón Listo. El teclado no desaparecerá si presento esto en un controlador de navegación modal.
TRABAJOS
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
[self.view addSubview:b.view];
NO FUNCIONA
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
navigationController.modalPresentationStyle = UIModalPresentationFormSheet;
navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
Si elimino la parte del controlador de navegación y presento 'b' como un controlador de vista modal por sí mismo, funciona. ¿Es el controlador de navegación el problema?
TRABAJOS
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
b.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:b animated:YES];
[b release];
TRABAJOS
broken *b = [[broken alloc] initWithNibName:@"broken" bundle:nil];
UINavigationController *navigationController =
[[UINavigationController alloc]
initWithRootViewController:b];
[self presentModalViewController:navigationController animated:YES];
[navigationController release];
[b release];
UINavigationController
clase. Salud.resignFirstResponder
estuviera ejecutando pero el teclado aún se mostraba. Mi escenario (presentationFormSheet con navig contrllr) es exactamente el mismo que el suyo. ¡¡Gracias una tonelada!!Respuestas:
En el controlador de vista que se presenta modalmente, simplemente anule
disablesAutomaticKeyboardDismissal
para devolverNO
:fuente
Esto ha sido clasificado como "funciona según lo previsto" por los ingenieros de Apple. Archivé un error para esto hace un tiempo. Su razonamiento es que el usuario a menudo va a ingresar datos en una forma modal, por lo que intentan ser "útiles" y mantener el teclado visible donde normalmente varias transiciones dentro de la vista modal pueden hacer que el teclado se muestre / oculte repetidamente.
editar: aquí está la respuesta de un ingeniero de Apple en los foros de desarrolladores:
Esto le está dando problemas a muchas personas (incluido yo mismo) pero en este momento no parece haber una forma de solucionarlo.
ACTUALIZAR:
En iOS 4.3 y versiones posteriores, ahora puede implementar `-disablesAutomaticKeyboardDismissal 'en su controlador de vista para devolver NO:
Esto soluciona el problema.
fuente
UINavigationController
subclase que se anuledisablesAutomaticKeyboardDismissal
para devolverNO
y usar esto como controlador de navegación cuando presente una hoja de formulario modal. Vea la respuesta de @ miha-hribar a continuación.Tenga cuidado si está mostrando el modal con a
UINavigationController
. Luego debe configurarlodisablesAutomaticKeyboardDismissal
en el controlador de navegación y no en el controlador de vista. Puedes hacer esto fácilmente con categorías.Archivo: UINavigationController + KeyboardDismiss.h
Archivo: UINavigationController + KeyboardDismiss.m
No olvide importar la categoría en el archivo donde usa UINavigationController.
fuente
disablesAutomaticKeyboardDismissal
deUINavigationController
, no el propio controlador de vista, para solucionar este problema.Resolví esto usando el
UIModalPresentationPageSheet
estilo de presentación y redimensionándolo inmediatamente después de presentarlo. Al igual que:fuente
Si alterna una pantalla modal diferente, puede hacer que el teclado desaparezca. No es bonito y no se anima, pero puedes hacer que desaparezca.
Sería genial si hubiera una solución, pero por ahora esto funciona. Puedes ponerlo en una categoría
UIViewController
y llamarlo cuando quieras que el teclado desaparezca:Sin embargo, tenga cuidado con esto cuando veaDidAppear / viewDidDisappear y se invoquen todos esos métodos. Como dije, no es bonito, pero funciona.
-Adán
fuente
También puede solucionar esto en una aplicación universal simplemente comprobando el idioma y, si se trata de un iPad, no abra el teclado automáticamente y deje que el usuario toque lo que quiera editar.
Puede que no sea la mejor solución, pero es muy sencillo y no necesita ningún truco elegante que rompa con la próxima versión principal de iOS :)
fuente
Ponga este código en su vista WillDisappear: el método del controlador actual es otra forma de solucionar esto:
fuente
Encontré eso
disablesAutomaticKeyboardDismissal
y agregar unadisablesAutomaticKeyboardDismissal
función no funcionó para miUITextField
en un diálogo modal.El teclado en pantalla simplemente no desaparecería.
Mi solución fue deshabilitar todos los controles de entrada de texto en mi cuadro de diálogo, y luego volver a habilitar los relevantes una fracción de segundo más tarde.
Parece que cuando iOS ve que ninguno de los
UITextField
controles están habilitados, entonces no deshacerse del teclado.fuente
Estoy seguro de que ha visto esto, pero está seguro de que su clase de controlador está correctamente conectada como delegado de UITextField, ¿verdad?
fuente
tal vez no devuelva NO, pero SÍ. Entonces puede desaparecer.
¿Y también tienes un
textFieldShouldEndEditing
SI?¿ Y por qué estás disparandolo siento, veo ahora[nextResponder becomeFirstResponder]
?¿Podemos suponer que ninguno de ellos, por casualidad, tiene un
tag
valor desecondField.tag+1
? Si es así, les está diciendo que se conviertan en el primer respondedor, en lugar de renunciar al primer respondedor. Tal vez ponga algo de NSLog () en esa estructura if.fuente
NSLog("tf %x / method ...",textField);
en todas las funciones de delegado?Para aquellos que tienen problemas con UINavigationController, vea mi respuesta a una pregunta similar aquí: https://stackoverflow.com/a/10507689/321785
Editar: Considero que esto es una mejora para la solución de Miha Hribar (ya que la decisión se está tomando donde debería), y a diferencia del comentario de Pascal con respecto a una categoría en UIViewController
fuente
puede no ser una solución perfecta, pero funciona
[self.view endEditing: YES];
desde donde se implementa su botón o gesto para presentar modal
fuente
fuente