He escrito mi propia función para desplazar los campos de texto hacia arriba cuando aparece el teclado. Para descartar el teclado tocando el campo de texto, he creado uno UITapGestureRecognizer
que se encarga de renunciar al primer respondedor en el campo de texto al tocar.
Ahora también he creado un autocompletado para el campo de texto que crea UITableView
justo debajo del campo de texto y lo llena con elementos a medida que el usuario ingresa el texto.
Sin embargo, al seleccionar una de las entradas en la tabla de autocompletado, didSelectRowAtIndexPath
no se llama. En cambio, parece que se está llamando al reconocedor de gestos de toque y simplemente renuncia al primer respondedor.
Supongo que hay alguna forma de decirle al reconocedor de gestos de toque que continúe pasando el mensaje de toque hacia abajo UITableView
, pero no puedo entender qué es. Cualquier ayuda será muy apreciada.
Respuestas:
Ok, finalmente lo encontré después de buscar a través de documentos de reconocimiento de gestos.
La solución fue implementar
UIGestureRecognizerDelegate
y agregar lo siguiente:Eso lo cuidó. Esperemos que esto ayude a otros también.
fuente
return ![touch.view isKindOfClass:[UITableViewCell class]];
![touch.view isEqual: self.tableView] &&
antes del[touch.view isDescendantOfView: self.tableView]
para excluirlotableView
(porqueisDescendantOfView:
también se devuelveYES
si la vista de argumento es la vista del receptor en sí). Espero que ayude a otras personas que quieren el mismo resultado.La forma más fácil de resolver este problema es:
Esto permite
UIGestureRecognizer
reconocer el toque y también pasar el toque al siguiente respondedor. Una consecuencia no deseada de este método es si tiene unaUITableViewCell
pantalla que empuja a otro controlador de vista. Si el usuario toca la fila para descartar el teclado, se reconocerán tanto el teclado como la pulsación. Dudo que esto sea lo que pretendes, pero este método es adecuado para muchas situaciones.Además, expandiendo la respuesta de Robert, si tiene un puntero a la vista de tabla en cuestión, puede comparar directamente su clase en lugar de tener que convertirla en una cadena y esperar que Apple no cambie la nomenclatura:
Recuerde, también debe declarar
UIGestureRecognizer
que tiene un delegado con este código.fuente
isDescendantOfView
lugar de simplemente verificar siclass
es igual, ya que puede estar tocando en una subvista. Depende de lo que necesites.Conjunto
cancelsTouchesInView
de su reconocedor a falso. De lo contrario, "consume" el toque por sí mismo y no lo pasa a la vista de tabla. Es por eso que el evento de selección nunca sucede.por ejemplo en
swift
fuente
Y para Swift (basado en la respuesta de @Jason):
fuente
Es posible que tenga una mejor solución para agregar un gesto de toque sobre una vista de tabla, pero al mismo tiempo permitir la selección de celdas:
Solo busco una celda en el punto de la pantalla donde el usuario está tocando. Si no se encuentra ninguna ruta de índice, entonces dejo que el gesto reciba el toque; de lo contrario, lo cancelo. Para mí funciona muy bien.
fuente
Creo que no hay necesidad de bloques de escritura de códigos simplemente fijados
cancelsTouchesInView
afalse
para su objeto gesto, por defecto estrue
y sólo hay que configurarlofalse
. Si está usando unUITapGesture
objeto en su código y también está usandoUIScrollView
(tableview, collectionview), establezca esta propiedadfalse
fuente
Una solución similar es implementar
gestureRecognizer:shouldReceiveTouch:
usando la clase de vista para determinar qué acción tomar. Este enfoque tiene la ventaja de no enmascarar los grifos en la región que rodea directamente la tabla (las vistas de estas áreas aún descienden de las instancias de UITableView, pero no representan celdas).Esto también tiene la ventaja de que funciona con varias tablas en una sola vista (sin agregar código adicional).
Advertencia: se supone que Apple no cambiará el nombre de la clase.
fuente
return ![[touch.view.superview class] isSubclassOfClass:[UITableViewCell class]];
Para Swift 4.2 la solución fue implementar
UIGestureRecognizerDelegate
y agregar lo siguiente:Cuando hace clic en la vista de tabla, este método de delegado devuelve falso y el
didSelectRowAtIndexPath
método de vista de tabla funciona correctamente.fuente
Tuve una situación diferente en la que quería que se llamara a la función de gesto táctil solo cuando el usuario tocaba afuera de la vista de tabla. Si el usuario tocó dentro de la vista de tabla, entonces no debería llamarse a la función de gesto táctil. Además, si se llama a la función de gesto táctil, aún debe pasar el evento táctil a la vista que se tocó en lugar de consumirlo.
El código resultante es una combinación de la respuesta de Abdulrahman Masoud y la respuesta de Nikolaj Nielsen.
Y en la
MyViewController
clase, la clase que tieneUITableView
, en elonViewDidLoad()
, me aseguré de llamaraddGestureRecognizer()
:fuente
Sólo hay que establecer
cancels touches in view
quefalse
para cualquier gesto por debajo de la(table/collection)View
:- Interfacebuilder
- Código
fuente
Si bien es tarde y muchas personas encuentran que las sugerencias anteriores funcionan bien, no pude lograr que los métodos de Jason o TMilligan funcionen.
Tengo un TableView estático con múltiples celdas que contienen campos de texto que reciben entradas de números usando solo el teclado numérico. Esto fue ideal para mí:
Asegúrese de haber implementado esto
<UIGestureRecognizerDelegate>
en su archivo .h.Esta línea
![touch.view isKindOfClass:[UITableViewCell class]]
verifica si se tocó una tableViewCell y descarta cualquier teclado activo.fuente
La solución simple es usar instancias UIControl en UITableViewCell para obtener toques. Puede agregar cualquier vista con userInteractionEnables == NO a UIControl para obtener toques.
fuente
Aquí está mi solución, que vincula directamente el reconocedor shouldReceiveTouch a si se muestra el teclado.
En su delegado de reconocimiento de gestos táctiles:
Y el
PFXKeyboardStateListener.h
:Y el
PFXKeyboardStateListener.m
:Es posible que desee actualizar el patrón singleton del oyente del teclado, todavía no lo he logrado. Espero que esto funcione para todos los demás, así como para mí. ^^
fuente
Implemente este método para delegar de UIGestureRecognizer:
fuente
En Swift puedes usar esto adentro
fuente
Mi caso fue diferente, incluyendo una barra de búsqueda y una vista de edición en self.view. Quería cerrar el teclado de uisearchbar tocando la vista.
En los métodos de delegado UISearchBar:
Cuando el usuario toca self.view:
fuente
Swift 5, mayo de 2020.
Tengo un textField y un tableView que se hace visible cuando ingreso texto.
Estado inicial Así que quiero 2 eventos diferentes cuando toco tableViewCell o algo más.
Se muestran el teclado y la vista de tabla
Primero agregamos tapGestureRecognizer.
Luego agregamos la siguiente verificación en UIGestureRecognizerDelegate:
}
Si quiero ocultar el teclado primero, tableView permanece visible y responde a mis toques.
ingrese la descripción de la imagen aquí
fuente
Esta es mi solución basada en las respuestas anteriores ... Me ha funcionado ...
fuente
PROBLEMA: en mi caso, el problema era que originalmente coloqué un botón en cada celda de collectionView y establecí las restricciones para llenar la celda, de modo que cuando se hacía clic en la celda, se hacía clic en el botón, sin embargo, la función de los botones estaba vacía, por lo que no había nada parece estar sucediendo
REVISIÓN: arreglé esto eliminando el botón de la celda de vista de colección.
fuente