Coordenadas de toque incorrectas después de la búsqueda en UITableView

Estoy bastante seguro de que la respuesta a mi pregunta es simple, pero después de un par de horas de golpearme la cabeza contra ella, me dirijo a ti...

Tengo un UITableView con un UISearchBar. La búsqueda parece funcionar bien, pero cuando busco y toco una celda, obtengo el IndexPath de la celda visible, no la coordenada de la celda relativa a la UITableView completa.

Ahora, estoy bastante seguro de que mi problema está relacionado con el hecho de que estoy usando gestos en lugar de didSelectRowAtIndex porque necesito manejar toques simples y dobles. Adjunté los reconocedores de gestos a la vista.

Los reconocedores de toque simple/doble obtienen la celda de la tabla seleccionada con esto:

CGPoint location = [gesture locationInView:self.tableView];
NSIndexPath *cellIndexPath = [self.tableView indexPathForRowAtPoint:location];

Mi UITableView está dimensionado para mostrar alrededor de 8 filas antes de tener que desplazarse. Sin texto ingresado en UISearchBar, esto funciona bien (ambos gestos). Si me desplazo a la fila 15 de UITableView y toco, cellIndexPath me devuelve la fila 15.

Sin embargo, si ingreso un término de búsqueda que requiere que el usuario se desplace, un toque en cualquier celda más allá de la primera pantalla me devuelve el cellIndexPath de la fila en relación con su posición visible actual (lo que significa que si me desplazo a la fila 10 y la coloco en la última fila de UITableView, el toque me da un índice de fila de 8.

Entonces, básicamente, estoy tratando de averiguar por qué el comportamiento es diferente cuando no se busca en UITableView y cuando se ingresa un término de búsqueda.

Gracias por tu ayuda Rob

preguntado el 03 de diciembre de 13 a las 13:12

¿Por qué necesitas trabajar con coordenadas? Desplazarse + coordenadas es buscar problemas. -

Usando coordenadas porque estoy tratando con gestos. Para obtener la celda tocada, primero tengo que obtener el CGPoint en UITableView. Encontré mi solución, sin embargo. Lo he agregado como respuesta. ¡Gracias por responder! -

Cuando toque una celda, se activarán sus métodos TableViewDelegate. Te llevan a la celda exacta a través de indexPath. Implementar tu propio comportamiento parece peligroso/innecesario -

Tienes razón, pero por todo lo que leí y lo que experimenté, didSelectRowAtIndex estaba interceptando el primer toque cuando tenía la intención de tocar dos veces (nunca obtendría el doble toque). La solución que encontré fue usar gestos. No estoy seguro de lo que quiere decir con peligroso, pero puedo entender innecesario si hay una mejor manera de obtener el gesto de doble toque mientras también usa didSelectRowAtIndex. -

Peligroso porque conduce a errores como el tuyo. ¿Por qué quieres que tus usuarios hagan doble toque? ¿Qué sucede con un solo toque? -

1 Respuestas

Guau, a veces escribir el problema te lleva a una solución... Esto es lo que me di cuenta. Estoy usando UISearchBar con un UISearchDisplayController. Mi comprensión rudimentaria es que cuando busca, el UISearchDisplayController reemplaza el tableView con el suyo propio para mostrar los resultados. Siendo ese el caso, mi código anterior estaba mirando el UITableView incorrecto cuando intentaba obtener la celda tocada al buscar. Entonces, modifiqué el código de la siguiente manera y todo parece estar bien.

CGPoint location;
NSIndexPath *cellIndexPath;
if (self.isSearching)
{
    location = [gesture locationInView:self.searchDisplayController.searchResultsTableView];
    cellIndexPath = [self.searchDisplayController.searchResultsTableView indexPathForRowAtPoint:location];
}
else
{
    location = [gesture locationInView:self.tableView];
    cellIndexPath = [self.tableView indexPathForRowAtPoint:location];
}

Respondido el 03 de diciembre de 13 a las 14:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.