Me pregunto cómo hacer que el teclado desaparezca cuando el usuario toca fuera de a UITextField
.
ios
cocoa-touch
uitextfield
uikit
jonepatr
fuente
fuente
Respuestas:
Tendrá que agregar un
UITapGestureRecogniser
y asignarlo a la vista, y luego llamar a resignar primer respondedorUITextField
en su selector.El código:
En vistaDidLoad
En despedir Teclado:
(¿Dónde
aTextField
está el campo de texto responsable del teclado?)La versión Swift 3 se ve así
Para despedir Keyboard
fuente
[aTextField resignFirstResponder]
lo que sería[self.view endEditing:YES];
, no necesita una referencia al campo de texto y funcionará para múltiples campos de texto[self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(endEditing:)]];
[tap setCancelsTouchesInView:NO];
según la respuesta de @qiaoyi; Tuve un problema con una tabla que no responde a las selecciones de fila. 5 años después, espero que esto ayude a alguien más.self.view.addGestureRecognizer(UITapGestureRecognizer(target: self.view, action: #selector(UIView.endEditing(_:))))
Apreté algunas respuestas.
Use un ivar que se inicializa durante
viewDidLoad:
Descarte lo que esté editando actualmente:
fuente
Mira esto, esta sería la forma más fácil de hacerlo,
O
Esta biblioteca se encargará de incluir el desplazamiento automático de la barra de desplazamiento, tocar el espacio para ocultar el teclado, etc.
https://github.com/michaeltyson/TPKeyboardAvoiding
fuente
Veo que algunas personas tienen problemas para usar el
UITapGestureRecognizer
método. La manera más fácil de lograr esta funcionalidad sin dejar intacto el comportamiento de toque de mi botón existente es agregar solo una línea a la respuesta de @ Jensen2k:Esto permitió que mis botones existentes siguieran funcionando sin usar el método de @Dmitry Sitnikov.
Lea sobre eso
property
aquí (busqueCancelsTouchesInView
): Referencia de clase de UIGestureRecognizerNo estoy seguro de cómo funcionaría con las barras de desplazamiento, ya que veo que algunos tenían problemas, pero espero que alguien más se encuentre con el mismo escenario que yo.
fuente
UIImageView
, agregue[imageView setUserInteractionEnabled:NO];
y haga clic en ella, lo que hace que este método funcione.Es mejor hacer
UIView
una instancia deUIControl
(en el generador de interfaces) y luego conectar suTouchUpInside
evento aldismissKeyboard
método. EstaIBAction
método se verá así:fuente
UITapGestureRecognizer
interferido con tocar botones dentro de la vista).touchesEnded
no funcionó porque había un problemaUIScrollView
con la cadena de respuesta.)Swift 4
Configure su
UIViewController
con este método de extensión una vez, por ejemplo, enviewDidLoad
:y el teclado se cerrará incluso tocando el botón
NavigationBar
.fuente
Versión rápida, esto funciona en combinación con otros elementos (como uno
UIButton
u otroUITextField
):fuente
self
más queself.view
canclesTouchesInView
Es una propiedad útil para usar. Gracias.c#
. FYI Ese punto y coma tiene sintaxis permitida, simplemente no es necesario.Qué tal esto: Sé que esta es una publicación antigua. Podría ayudar a alguien :)
fuente
Esta es una buena solución genérica:
C objetivo:
Rápido:
Basado en la solución @icodebuster: https://stackoverflow.com/a/18756253/417652
fuente
Swift 4 oneliner
fuente
Creo que la forma más fácil (y mejor) de hacer esto es subclasificar su vista global y usar el
hitTest:withEvent
método para escuchar cualquier toque. Los toques en el teclado no están registrados, así que hitTest: withEvent solo se llama cuando tocas / desplazas / deslizas / pellizcas ... en otro lugar, luego llamas[self endEditing:YES]
.Esto es mejor que usar
touchesBegan
porquetouchesBegan
no se llama si hace clic en un botón en la parte superior de la vista. Es mejorUITapGestureRecognizer
que no reconocer un gesto de desplazamiento, por ejemplo. También es mejor que usar una pantalla tenue porque en una interfaz de usuario compleja y dinámica, no se puede poner la pantalla tenue en todas partes. Además, no bloquea otras acciones, no necesita tocar dos veces para seleccionar un botón en el exterior (como en el caso de aUIPopover
).Además, es mejor que llamar
[textField resignFirstResponder]
, ya que puede tener muchos campos de texto en la pantalla, por lo que esto funciona para todos ellos.fuente
Esta debe ser la forma más fácil de ocultar su teclado tocando afuera:
(de ¿Cómo descartar el teclado cuando el usuario toca otra área fuera del campo de texto? )
fuente
Si la vista está incrustada en absoluto
UIScrollView
, puede usar lo siguiente:El primero animará el teclado fuera de la pantalla cuando se desplaza la vista de la tabla y el segundo ocultará el teclado como la aplicación de Mensajes.
fuente
Puede hacer esto usando el Storyboard en XCode 6 y superior:
Crea la acción para ocultar el teclado
Agregue esto al archivo de encabezado de la clase utilizada por su ViewController:
Luego agregue esto al archivo de implementación del mismo ViewController:
Esta será ahora una de las 'Acciones recibidas' para su escena del guión gráfico (es decir, ViewController):
Conecta la acción al evento del usuario
Ahora debe conectar esta acción al gesto del usuario de tocar el teclado.
Importante: debe convertir el 'UIView' que está contenido en su guión gráfico a un UIControl , para que pueda recibir eventos. Seleccione la vista de su jerarquía de escena del controlador de vista:
... y cambia su clase:
Ahora arrastre desde el círculo pequeño al lado de la 'acción recibida' para su escena, a una parte 'vacía' de su escena (en realidad está arrastrando la 'Acción recibida' al UIControl). Se le mostrará una selección de eventos a los que puede conectar su acción para:
Seleccione la opción 'retocar dentro'. Ahora ha conectado la IBAction que creó a la acción del usuario de tocar el teclado. Cuando el usuario toca el teclado, ahora estará oculto.
(NOTA: Para enganchar la acción al evento, también puede arrastrar desde la acción recibida directamente al UIControl en la jerarquía de View Controllers. Se muestra como 'Control' en la jerarquía).
fuente
Si te entendí bien, quieres renunciar al teclado mientras tocas el lado
textfield
pero no tienes referencia de tutextfield
.Prueba esto;
reftextField
Ahora en
textFieldDidBeginEditing
establecer campo de texto referenciado aAhora puede usarlo felizmente en cualquier reloj de botón (se recomienda agregar un botón transparente al comenzar a editar)
O para renunciar al botón hecho, intente esto.
fuente
Solo para agregar a la lista aquí mi versión de cómo descartar un teclado en el toque externo.
viewDidLoad:
En cualquier sitio:
fuente
Un montón de excelentes respuestas aquí sobre el uso de
UITapGestureRecognizer
--todos de los cuales se rompeUITextField
el botón claro (X). La solución es suprimir el reconocedor de gestos a través de su delegado:No es la solución más robusta, pero funciona para mí.
fuente
return !touchViewIsButton
. Supongo que cualquier otro botón que deba descartar el teclado debería hacerlo en sus acciones. Además, es posible que no se llame a TouchUpInside cuando el diseño cambia al cerrar el teclado.Puede crear una categoría para UiView y anular los toques de inicio del método de la siguiente manera.
Me está funcionando bien y es una solución centralizada para este problema.
fuente
Versión rápida de la respuesta de @ Jensen2k:
Un trazador de líneas
fuente
Utilicé el ejemplo de Barry para mi nuevo desarrollo. ¡Funcionó muy bien! pero tuve que incluir un cambio leve, requerido para descartar el teclado solo para el campo de texto que se está editando.
Entonces, agregué al ejemplo de Barry lo siguiente:
Además, cambié el método hideKeyboard de la siguiente manera:
fuente
Una de las formas más fáciles y cortas es agregar este código a su
viewDidLoad
fuente
fuente
Intenté muchas de las respuestas aquí y no tuve suerte. Mi reconocedor de gestos de toque siempre causaba
UIButtons
que no respondiera cuando lo tocaba, incluso cuando configurabacancelsTouchesInView
propiedad del reconocedor de gestos en NO.Esto es lo que finalmente resolvió el problema:
Tener un ivar:
Cuando un campo de texto comienza a editar, configure el reconocedor de gestos:
Entonces el truco está en cómo configuras el
dismissKeyboard
método:Supongo que hay algo acerca de sacar la
dismissKeyboardSelector
ejecución de la pila de ejecución de manejo táctil ...fuente
Enviar mensaje
resignFirstResponder
al archivo de texto que lo puso allí. Por favor, vea esta publicación para más información.fuente
Esto funciona
En este ejemplo, aTextField es el único UITextField ... Si hay otros o UITextViews, hay un poco más por hacer.
fuente
fuente
Agregue este código en su archivo ViewController.m :
fuente
En este caso, se puede usar ScrollView y agregarlo
TextField
en ScrollView y quiero tocarScrollView
y luego en Descartar el teclado. Traté de crear un código de muestra por si acaso. Me gusta esto,Tu guión gráfico Mira eso al igual que.
fuente
Puede usar el método UITapGestureRecongnizer para cerrar el teclado haciendo clic fuera de UITextField. Al usar este método cada vez que el usuario haga clic fuera de UITextField, el teclado se descartará. A continuación se muestra el fragmento de código para usarlo.
fuente
Establecer los campos de texto delegado a la vista se cargó:
Agregue esta función:
fuente