Tengo una UITableView
con UITextField
s como celdas. Me gustaría descartar el teclado cuando UITableView
se toca el fondo del . Estoy tratando de hacer esto creando un UIButton
tamaño del UITableView
y colocándolo detrás del UITableView
. El único problema es UIButton
captar todos los toques incluso cuando el toque está en UITableView. ¿Qué estoy haciendo mal?
¡Gracias!
ios
uitableview
uikeyboard
Hua-Ying
fuente
fuente
Respuestas:
Esto se hace fácilmente creando un objeto UITapGestureRecognizer (de forma predeterminada, esto detectará un "gesto" en un solo toque, por lo que no se requiere más personalización), especificando un objetivo / acción para cuando se dispara el gesto y luego adjuntando el objeto reconocedor de gestos a la vista de su mesa.
Por ejemplo, quizás en su
viewDidLoad
método:Y el
hideKeyboard
método podría verse así:Tenga en cuenta que el gesto no se dispara al tocar el interior de un
UITextField
objeto. Se dispara en elUITableView
fondo, la vista de pie de página, la vista de encabezado y enUILabels
celdas internas, etc.fuente
gestureRecognizer.cancelsTouchesInView = NO;
hideKeyboard
método, en lugar de comunicarse directamente con los campos de texto, puede hacerlo[self.view endEditing:NO];
. De los documentos de Apple: " Este método examina la vista actual y su jerarquía de subvista para el campo de texto que es actualmente el primer respondedor. Si encuentra uno, le pide al campo de texto que renuncie como primer respondedor. Si el parámetro de fuerza está configurado en SÍ, el campo de texto ni siquiera se pregunta; se ve obligado a renunciar "La solución UITapGestureRecognizer funciona con la selección de celdas de la tabla si establece:
fuente
shouldReceiveTouch
Esta es la mejor forma de hacerlo. Solo haz esto
o
fuente
También puedes hacerlo desde Storyboard:
fuente
Como
UITableView
es una subclase deUIScrollView
, implementar un método de delegado a continuación proporciona una solución rápida y extremadamente fácil. No hay necesidad de involucrarse,resignFirstResponder
ya que la jerarquía de vista hace introspecciones y encuentra al respondedor actual y le pide que renuncie a su estado de respondedor.Y recuerde agregar
UIScrollViewDelegate
al archivo de encabezado.fuente
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
self.tableView.keyboardDismissMode = UIScrollViewKeyboardDismissMode.onDrag
En primer lugar, escuche
scrollViewWillBeginDragging
suUIViewController
agregando elUIScrollViewDelegate
:En archivo .h:
En archivo .m:
Luego escuche otras interacciones:
Luego implemente
dismissKeyboard
:Y si, como yo, quisiera descartar el teclado para un UITextField dentro de una celda de tabla personalizada:
¡Espero que ayude a cualquiera que busque!
fuente
fuente
Aquí está la versión rápida para su placer de codificación:
Agrega un reconocedor de gestos de toque y luego cierra el teclado. ¡No se requiere salida para TextField!
fuente
Existe la versión Swift 3 sin bloquear los toques en las celdas.
En
viewDidLoad()
método:Y se
hideKeyboard
ve así:fuente
Lo hice así:
Cree un método en su TableViewController para desactivar el primer respondedor (que sería su TextBox en ese momento)
En
tableView:didSelectRowAtIndexPath:
llamar al método anterior:fuente
didSelectRowAtIndexPath
no se dispara si toca el TableView en sí.Tuve una
UITableViewController
y la implementacióntouchesBegan:withEvent:
no funcionó para mí.Esto es lo que funcionó:
Rápido:
C objetivo:
fuente
Luego asegúrese de que en su archivo Nib establezca el tipo de su UITableView en DismissableUITableView ..... tal vez podría haber pensado en un mejor nombre para esta clase, pero entiende el punto.
fuente
Si tiene como objetivo iOS7, puede usar uno de los siguientes:
El primero animará el teclado fuera de la pantalla cuando se desplace la vista de tabla y el segundo ocultará el teclado como la aplicación de mensajes estándar.
Tenga en cuenta que estos son de
UIScrollView
, queUITableView
hereda de.fuente
Prueba esto:
fuente
UITableView es una subclase de UIScrollView.
La forma en que lo hice fue escuchar un evento de desplazamiento por parte del usuario y luego resignFirstResponder. Aquí está el método UIScrollViewDelegate para implementar en su código;
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
Al abordar este tipo de problemas, he encontrado que la mejor manera es investigar los protocolos delegados para cada objeto y los de las clases principales (en este caso, UITableViewDelegate, UIScrollViewDelegate. El número de eventos que dispara los objetos NS es bastante grande y completo. también es más fácil implementar un protocolo que subclasificar cualquier cosa.
fuente
Tuve el mismo problema y aquí está mi solución, funciona perfectamente para mí:
En la vista o el controlador de vista que implementó
<UITextFieldDelegate>
(En mi caso tengo una costumbre
UITableViewCell
llamado TextFieldCell),Declare el
UITapGestureRecognizer
como una propiedad:E inicialícelo en su vista / controlador:
En el
- (void)textFieldDidBeginEditing:(UITextField *)textField
método, usesuperView
para moverse hasta su tableView y llameaddGestureRecognizer
:Y en el
- (void)textFieldDidEndEditing:(UITextField *)textField
, simplemente elimine el reconocedor de gestos:Espero eso ayude.
fuente
Quería que mi celda abriera el teclado cuando se seleccionara cualquier parte de la celda y que la cerrara si hacía clic en cualquier parte fuera de la celda. Para abrir el teclado:
(NOTA: he subclasificado la celda, pero puede lograrlo fácilmente en el
tableView:didSelectRowAtIndexPath:
método delegado deUITableView
)Hacer esto significaba que con las soluciones principales, si hacía clic en la celda dos veces, el teclado temblaría, ya que, primero, el reconocedor de gestos intentó cerrar el teclado y, en segundo lugar, la celda se volvió a seleccionar e intentó abrir el teclado.
La solución es verificar si el clic ocurrió dentro de la celda seleccionada actualmente:
fuente
Encontré una solución que funciona muy bien.
Se necesita para usar UIGestureRecognizerDelegate y el método - gestoRecognizer: shouldReceiveTouch: .
Agregue el reconocedor de gestos a TableView de la siguiente manera:
Luego, implemente el método delegado shouldReceiveTouch para rechazar los toques que se realizan en la clase UITableViewCell. El método hideKeyboard solo se llamará cuando el toque se haya realizado fuera de la clase UITableViewCell.
fuente
UITableView
tiene unabackgroundView
propiedad útil , con la que logré este comportamiento sin interferir con la selección de celda, como se muestra a continuación en Swift:fuente
Estaba buscando la solución y no encontré nada que se ajustara a mi código, así que lo hice así:
http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap
Es básicamente una combinación de los enfoques mencionados anteriormente, pero no requiere subclasificar nada ni crear botones de fondo.
fuente
Simplemente usando un UITapGestureRecognizer y
cancelsTouchesInView = NO
significa que los toques en las celdas y UITextViews también activan la ocultación. Esto es malo si tiene múltiples UITextViews y toca el siguiente. El teclado comenzará a ocultarse y luego el siguiente textView se convierte en el primer Respondedor y el teclado se vuelve visible nuevamente. Para evitar esto, verifique la ubicación del grifo y solo oculte el teclado si el grifo no está en una celda:Para
scrollViewWillBeginDragging:
que se active, lascrollEnabled
propiedad tableView debe serYES
fuente
¿Por qué quieres crear una tabla llena de campos de texto? Debería utilizar una vista detallada para cada fila que contiene los campos de texto. Cuando presione su vista detallada, asegúrese de llamar a "[myTextField BecomeFirstResponder]" para que el usuario pueda comenzar a editar con solo un clic de distancia de la lista de la tabla.
fuente
Si está dispuesto a subclasificar (¡uf!) La vista de su tabla, algo como esto podría funcionar:
fuente
Si desea cerrar el teclado mientras se presiona la tecla de retorno, simplemente puede agregar el siguiente código en el método de retorno de textField, es decir:
Algunos campos de texto pueden tener una vista de selector o alguna otra como subvista, por lo que en ese caso el método anterior no funciona, por lo que en ese caso debemos hacer uso de la clase UITapGestureRecognizer, es decir, agregar el siguiente fragmento de código al método viewDidLoad, es decir:
Ahora simplemente agregue el respondedor de renuncia al método selector, es decir:
Espero que ayude, gracias :)
fuente
Muchas respuestas interesantes. Me gustaría compilar diferentes enfoques en la solución que pensé que se ajusta mejor a un escenario de UITableView (es el que suelo usar): lo que normalmente queremos es básicamente ocultar el teclado en dos escenarios: al tocar fuera de los elementos de la interfaz de usuario de texto, o al desplazarse hacia abajo o hacia arriba en UITableView. El primer escenario lo podemos agregar fácilmente a través de TapGestureRecognizer, y el segundo a través del método UIScrollViewDelegate scrollViewWillBeginDragging :. Primera orden del día, el método para ocultar el teclado:
Este método renuncia a cualquier interfaz de usuario de textField de las subvistas dentro de la jerarquía de vista UITableView, por lo que es más práctico que renunciar a cada elemento de forma independiente.
A continuación, nos encargamos de descartar mediante un gesto Tap externo, con:
Establecer tapGestureRecognizer.cancelsTouchesInView en NO es para evitar que el gestoRecognizer anule el funcionamiento interno normal de UITableView (por ejemplo, para no interferir con la selección de celda).
Finalmente, para manejar ocultar el teclado al desplazarse hacia arriba / abajo en UITableView, debemos implementar el método scrollViewWillBeginDragging: del protocolo UIScrollViewDelegate, como:
archivo .h
archivo .m
¡Espero que ayude! =)
fuente
Así es como finalmente hice las obras. Combiné sugerencias y códigos de diferentes respuestas. Funciones: descartar el teclado, mover los campos de texto sobre el teclado mientras se edita y se configura el tipo de retorno del teclado "Siguiente" y "Listo". REEMPLAZAR "..." con más campos
fuente
La respuesta de @ mixca es muy útil, pero ¿y si tengo algo diferente de UITextField? Creo que la mejor manera de manejarlo es buscar todas las subvistas de la vista principal con función recursiva, ver el ejemplo a continuación
y también puede poner este método en su clase de utilidad y puede usarlo desde el gesto de toque como la respuesta de @ mixca.
fuente
Rápido 4 / 4.2 / 5
También puede cerrar el teclado cuando se toca una celda, antes de hacer cualquier otra cosa.
fuente
tableView.keyboardDismissMode = .onDrag // .interactive
fuente