iOS: al tocar en UITableView no se llama a didSelectRowAtIndexPath
ipad ios6 (8)
El otro sospechoso podría ser un Reconocedor de gestos de Tap establecido en la vista del controlador de vista tragando todos los grifos como un agujero negro. Eliminar el reconocedor de gestos habilitado sí seleccionó. Simplemente tuve el mismo problema y el gesto del grifo fue la causa.
Mi aplicación utiliza una UITableView
con un UINavigationController
para mostrar una vista más detallada cuando se UINavigationController
una fila de la tabla: la rutina básica de desglose.
Cuando toco en una fila, se resalta, pero los métodos delegados tableView:willSelectRowAtIndexPath:
o tableView:didSelectRowAtIndexPath:
no se llaman (se verifica mediante depurador).
Ahora aquí está la parte extraña:
Hay otras vistas de tabla en la aplicación (no profundizan) y ninguna muestra el problema.
Si toco la fila rápida y repetidamente, después de muchos intentos (10 - 20 es normal), se
tableView:willSelectRowAtIndexPath:
ytableView:didSelectRowAtIndexPath:
procesamiento continúa normalmente.El problema ocurre solo en un (cualquiera, de hecho) iPad con iOS 6. Funciona bien con iPads con iOS 5, o con cualquier iPhone con cualquier versión de iOS, 6. También funciona con el simulador de iPad con iOS 5 o 6.
Parece que algo está recibiendo el grifo antes de llamar a los métodos de delegado. ¿Pero que?
No uso ningún UITapGestureRecognizer
, así que ese no es el problema . No UITableViewControllers
múltiples UITableViewControllers
para la tabla, por lo que este tampoco es el problema .
Encontré un problema similar. iOS 6 parece ser mucho más sensible al menor movimiento ascendente en un toque en una celda de vista de tabla. Parece que está registrando el más mínimo movimiento como una solicitud de desplazamiento en lugar de una selección de celda. Mi vista de tabla se configuró en scrollEnabled: NO porque es una vista de tabla con valores de selección estáticos. La vista de tabla aparece dentro de un área pequeña de una vista de iPad más grande. Si toco cuidadosamente una celda y la levanto directamente hacia arriba, se selecciona la celda.
Para resolverlo, cambié scrollEnabled a YES y me aseguré de que el área dedicada a mi tableView fuera más grande que el área real necesaria para mostrar la vista de tabla, evitando así que se desplace. No estoy seguro de si esta es la causa del problema que está experimentando, pero espero que ayude.
Estaba teniendo este problema con una aplicación cuando se ejecuta en iOS6. El tableView:didSelectRowAtIndexPath:
nunca se activó, aunque estaba funcionando antes de actualizar a iOS6.
Finalmente lo descubrí mirando el xib y el inspector de atributos de la mesa. En la sección Vista de tabla, tuve la opción Selección establecida en Sin selección y Mostrar selección en Toque no fue seleccionada.
Cambiar la opción de Selección a Selección única en realidad me funcionaba de nuevo y dejar la selección de Mostrar en contacto no seleccionado significa que no veo ningún flash o cambio de color cuando se selecciona la fila.
La razón habitual por la que didSeletRowAtIndexPath () no se llama es teniendo un UITapGestureRecognizer en su viewcontroller con ''Cancela toques en la vista'' establecido en ''SÍ''.
La solución correcta y la única solución sensata es establecer ''Cancela toques en la vista'' a ''NO''. Entonces la selección de fila de la tabla debería funcionar bien.
Obviamente, esto tiene algunas implicaciones en los manejadores de gestos: puede que necesite agregar algún código a su manejador de gestos para detener algunos toques en sus vistas, es decir,
- (IBAction)onTapGesture:(UITapGestureRecognizer *)sender {
if (sender.view == someOldViewThatINeedToDealWith) {
sender.cancelsTouchesInView = true;
}
}
La resolución es realmente extraña: el UITableViewController se registró para todas las notificaciones. En el controlador para las notificaciones, los datos de la vista de tabla se estaban recargando usando
[self.tableView reloadData]
Según Apple DTS, cuando la tabla vuelve a cargar datos, esto hace que se envíe una notificación al observador, lo que causa una condición de carrera ...
No hay explicación de por qué funcionaría a veces o por qué siempre funcionaría en un iPhone. ¡Pero registrarme solo para un pequeño subconjunto de notificaciones (es decir, las que realmente me interesaban) solucionó el problema!
Probé todas las otras respuestas publicadas, y aunque parecían prometedoras, no resolvieron el problema.
Desde entonces, descubrí la causa del problema en mi caso: estaba llamando [self.tableView reloadData]
en un hilo diferente (debido a la manipulación de un evento NSNotification publicado a partir de un hilo de trabajador de fondo).
[self.tableView reloadData]
el problema cambiando [self.tableView reloadData]
a
[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
Espero que esto ayude.
Yo tuve el mismo problema. La UITableView no didSelectRowAtIndexPath
método didSelectRowAtIndexPath
cuando se ejecutaba en iOS6, pero funcionaba bien en iOS5.1.
También había implementado el
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath{
return NO;
}
y devolvió NO. En iOS5 todo funcionaba bien, pero en el momento en que cambiaba a iOS6 dejaba de activar el didSelectRowAtIndexPath
. Una vez que shouldHighlightRow
ese método de shouldHighlightRow
, todo volvió a funcionar en iOS6. ¡Aclamaciones!
en mi caso, tuve un botón que recibió todos los eventos táctiles antes de tableviewcell