iphone - UITableView didSelectRowAtIndexPath llamado dos veces
(4)
En ciertas circunstancias, se llama dos veces a UITableView didSelectRowAtIndexPath
lo que provoca el error. Pushing the same view controller instance more than once is not supported
el Pushing the same view controller instance more than once is not supported
.
Aquí está la secuencia de eventos:
TableView::didSelectRowAtIndexPath.
TableView::viewWillDisappear.
PushedViewController::viewWillAppear.
TableView::didSelectRowAtIndexPath.
Error: Pushing the same view controller instance more than once is not supported''
Lo único que vale la pena señalar es que el UITableView está cargando imágenes de forma asíncrona, pero que nunca llama didSelectRowAtIndexPath
. Además, el PushedViewController se reutiliza para evitar tener que volver a cargarlo cada vez que se selecciona una celda en el UITableView.
Alguien tiene alguna idea de lo que puede estar causando esto? Gracias.
Deshabilite la interacción del usuario después del primer "didSelectRow". Es posible que varios toques se apilen durante la transición.
Por lo general, se necesita a alguien con una destreza sorprendente en sus dedos para obtener este comportamiento, pero aún así.
Esto ocurre debido al segmento que está utilizando dentro del método didSelectRowAtIndexPath
. Asegúrese de que este segmento se crea al arrastrar ctrl desde el botón de vista en la parte superior del controlador de vista de origen al controlador de vista de destino. El error se produce cuando se crea el arrastre de control por control de la vista de tabla desde la celda de vista de tabla. No necesitas cambiar ninguno de tus códigos. Simplemente borre el segue y créelo de la manera correcta. Espero que esto resuelva tu problema, si tengo la pregunta correcta.
También estoy viendo este problema, probablemente uno de cada 1000 usuarios se ve afectado, o menos. Puedo ver claramente dos didSelectRowAtIndexPath registrando 50 ms uno tras otro. Supongo que es un error en iOS: no se deben dirigir los toques nuevos a la vista anterior una vez que se haya introducido el nuevo controlador de vista. Por desgracia, depende de nosotros escribir un código de protección contra esto. Esto es lo que estoy pensando:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
if (self.navigationController.topViewController != self)
return;
... do other stuff
}
si ya has creado Storyboard Segue no llames;
[self performSegueWithIdentifier:@"TYPE" sender:self];
en este metodo
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath