Tengo bastantes controles dispersos por muchas celdas de tabla en mi tabla, y me preguntaba si hay una manera más fácil de descartar el teclado sin tener que recorrer todos mis controles y renunciar a todos como el primer respondedor. Supongo que la pregunta es ... ¿Cómo obtendría la primera respuesta actual al teclado?
objective-c
cocoa-touch
sdk
Diecisiete
fuente
fuente
[[[UIApplication sharedApplication] keyWindow] endEditing:YES];
Respuestas:
Tratar:
fuente
[self.view endEditing:YES];
valores BOOL son SÍ / NO en Objective-C.Puede forzar la vista de edición actual para que renuncie a su primer estado de respuesta con
[view endEditing:YES]
. Esto oculta el teclado.A diferencia
-[UIResponder resignFirstResponder]
,-[UIView endEditing:]
buscará en subvistas para encontrar el primer respondedor actual. Por lo tanto, puede enviarlo a su vista de nivel superior (por ejemplo,self.view
en aUIViewController
) y hará lo correcto.(Esta respuesta anteriormente incluía un par de otras soluciones, que también funcionaron pero fueron más complicadas de lo necesario. Las eliminé para evitar confusiones).
fuente
[self.view endEditing:YES];
respuesta es mejor.[UIView endediting:]
funciona. En una de las aplicaciones que he desarrollado, se agregó un cuadro de búsqueda en UINavigationViewController, si solo llama[self.view endEditing:YES]
, comoself
su controlador de vista, esto no funcionará, en su lugar, llamé a este método directamente en el alcance de la vista donde se agregó el cuadro de búsqueda, por ejemplo:[self.mySearchBoxView endEditing:YES]
.Puede enviar una acción específica nula a la aplicación, renunciará al primer respondedor en cualquier momento sin tener que preocuparse sobre qué vista tiene actualmente el estado del primer respondedor.
C objetivo:
Swift 3.0:
Las acciones dirigidas a cero son comunes en Mac OS X para los comandos de menú, y aquí hay un uso para ellas en iOS.
fuente
Para ser honesto, no estoy loco por ninguna de las soluciones propuestas aquí. Encontré una buena manera de usar un TapGestureRecognizer que creo que llega al corazón de su problema: cuando hace clic en cualquier cosa que no sea el teclado, descarte el teclado.
En viewDidLoad, regístrese para recibir notificaciones de teclado y cree un UITapGestureRecognizer:
Agregue el teclado mostrar / ocultar respondedores. Allí agrega y elimina el TapGestureRecognizer a la UIView que debería descartar el teclado cuando se toca. Nota: No tiene que agregarlo a todas las subvistas o controles.
TapGestureRecognizer llamará a su función cuando reciba un toque y puede cerrar el teclado de esta manera:
Lo bueno de esta solución es que solo filtra por Taps, no por deslizamientos. Por lo tanto, si tiene contenido desplazable sobre el teclado, los desplazamientos seguirán desplazándose y dejarán el teclado en pantalla. Al eliminar el reconocedor de gestos después de que el teclado se ha ido, los toques futuros en su vista se manejan normalmente.
fuente
Esta es una solución para hacer que el teclado desaparezca cuando se presiona
return
en cualquier campo de texto, agregando código en un lugar (por lo que no tiene que agregar un controlador para cada campo de texto):considere este escenario:
Tengo un
viewcontroller
con dos campos de texto (nombre de usuario y contraseña). y el protocolo deviewcontroller
implementosUITextFieldDelegate
hago esto en viewDidLoad
y el viewcontroller implementa el método opcional como
e independientemente del campo de texto en el que se encuentre, tan pronto como presione
return
el teclado, ¡se descarta!En su caso, lo mismo funcionaría siempre que configure todo el delegado del campo de texto para autoejecutar e implementar
textFieldShouldReturn
fuente
Un mejor enfoque es tener algo "robar" el estado del primer respondedor.
Como UIApplication es una subclase de UIResponder, puede intentar:
De lo contrario, cree un nuevo UITextField con un marco de tamaño cero, agréguelo a una vista en algún lugar y haga algo similar (seguido de la renuncia).
fuente
Guarda esto en alguna clase de utilidad.
fuente
@Nicholas Riley y @Kendall Helmstetter Geln y @cannyboy:
¡Absolutamente brillante!
Gracias.
Teniendo en cuenta sus consejos y los consejos de otros en este hilo, esto es lo que he hecho:
Cómo se ve cuando se usa:
[[self appDelegate] dismissKeyboard];
(nota: agregué appDelegate como una adición a NSObject para poder usar en cualquier lugar en cualquier cosa)Cómo se ve debajo del capó:
EDITAR
Enmienda a mi respuesta a incluido
tempTextField.enabled = NO;
. La desactivación del campo de texto evitaráUIKeyboardWillShowNotification
yUIKeyboardWillHideNotification
notificaciones que se envían desde el teclado debe confiar en que estas notificaciones a través de su aplicación.fuente
Consejo rápido sobre cómo descartar el teclado en iOS cuando un usuario toca cualquier parte de la pantalla fuera del UITextField o el teclado. Teniendo en cuenta la cantidad de espacio que puede ocupar el teclado iOS, tiene sentido tener una forma fácil e intuitiva para que sus usuarios descarten el teclado.
Aquí hay un enlace
fuente
Aquí hay muchas respuestas demasiado complicadas, tal vez porque no es fácil de encontrar en la documentación de iOS. JosephH lo tenía justo arriba:
fuente
Incluso más simple que la respuesta de Meagar
Sobrescribir
touchesBegan:withEvent:
Esto lo hará
dismiss the keyboard
cuando toques cualquier parte delbackground
.fuente
Esto es lo que uso en mi código. ¡Funciona a las mil maravillas!
En yourviewcontroller.h agregue:
@property (nonatomic) UITapGestureRecognizer *tapRecognizer;
Ahora en el archivo .m, agregue esto a su función ViewDidLoad:
Además, agregue esta función en el archivo .m:
fuente
En el archivo de encabezado de su controlador de vista, agregue
<UITextFieldDelegate>
a la definición de la interfaz de su controlador para que se ajuste al protocolo delegado UITextField ...... En el archivo de implementación del controlador (.m) agregue el siguiente método, o el código dentro de él si ya tiene un método viewDidLoad ...
... Luego, vincula tu TextBox a tu campo de texto real
fuente
Debe enviar
endEditing:
a la ventana de trabajo siendo la subclase deUIView
fuente
La mejor manera de descartar el teclado de UITableView y UIScrollView son:
fuente
En swift 3 puedes hacer lo siguiente
fuente
La respuesta de Jeremy no me funcionó, creo que porque tenía una pila de navegación en una vista de pestaña con un diálogo modal encima. Estoy usando lo siguiente en este momento y está funcionando para mí, pero su kilometraje puede variar.
fuente
También es posible que deba anular UIViewController deshabiliteAutomaticKeyboardDismissal para que esto funcione en algunos casos. Es posible que esto deba hacerse en el UINavigationController si tiene uno.
fuente
Subclase sus campos de texto ... y también vistas de texto
En la subclase pon este código ...
En el campo de texto delegados (de manera similar para los delegados de vista de texto)
Todo listo ... Ahora solo publique la notificación desde cualquier parte de su código. Renunciará a cualquier teclado.
fuente
Y en rapidez podemos hacer
fuente
Para descartar un teclado después de que el teclado ha aparecido, hay 2 casos ,
cuando UITextField está dentro de un UIScrollView
cuando UITextField está fuera de UIScrollView
2.cuando el UITextField está fuera de UIScrollView, anule el método en su subclase UIViewController
también debe agregar delegado para todos los UITextView
para crear una IBAction, presione ctrl + clic en UITapGesture y arrástrelo al archivo .h de viewcontroller.
Aquí he nombrado tappedEvent como mi nombre de acción
la información proporcionada anteriormente se obtuvo del siguiente enlace, consulte para obtener más información o contácteme si no comprende los datos anteriores.
http://samwize.com/2014/03/27/dismiss-keyboard-when-tap-outside-a-uitextfield-slash-uitextview/
fuente
Odio que no haya una forma "global" de descartar programáticamente el teclado sin usar llamadas privadas de API. Con frecuencia, tengo la necesidad de descartar el teclado mediante programación sin saber qué objeto es el primer respondedor. He recurrido a inspeccionar el
self
uso de la API de tiempo de ejecución Objective-C, enumerar todas sus propiedades, extraer aquellas que son de tipoUITextField
y enviarles elresignFirstResponder
mensaje.No debería ser tan difícil hacer esto ...
fuente
No es bonito, pero la forma en que renuncio al primer Respondedor cuando no sé cuál es ese respondedor:
Cree un UITextField, ya sea en IB o mediante programación. Hazlo oculto. Vincúlelo a su código si lo hizo en IB. Luego, cuando desea cerrar el teclado, cambia el respondedor al campo de texto invisible e inmediatamente lo renuncia:
fuente
Puede iterar recursivamente a través de subvistas, almacenar una matriz de todos los UITextFields, y luego recorrerlos y renunciar a todos.
No es realmente una gran solución, especialmente si tiene muchas subvistas, pero para aplicaciones simples debería ser el truco.
Resolví esto de una manera mucho más complicada, pero mucho más eficiente, pero usando un singleton / manager para el motor de animación de mi aplicación, y cada vez que un campo de texto se convirtió en el respondedor, asignaría asignarlo a una estática que obtendría barrido (resignado) basado en ciertos otros eventos ... es casi imposible para mí explicarlo en un párrafo.
Sé creativo, solo me tomó 10 minutos pensar en esto para mi aplicación después de encontrar esta pregunta.
fuente
Un método un poco más robusto que necesitaba usar recientemente:
Descubrí que algunos de los otros métodos "globales" no funcionaban (por ejemplo,
UIWebView
y meWKWebView
negué a renunciar).fuente
Agregue A Tap Gesture Recognizer a su vista y defínalo como una acción
su archivo .m será como
Me ha funcionado
fuente
Sí, endEditing es la mejor opción. Y desde iOW 7.0,
UIScrollView
tiene una característica genial para descartar el teclado al interactuar con la vista de desplazamiento. Para lograr esto, puede establecer lakeyboardDismissMode
propiedad deUIScrollView
.Establezca el modo de descarte del teclado como:
Tiene pocos otros tipos. Echa un vistazo a este documento de Apple .
fuente
En rápido:
fuente
la forma más fácil es llamar al método
fuente
Tienes que usar uno de estos métodos,
o
fuente