2011-04-05 15 views
7

Tengo un UITableViewController la gestión de un objeto UITableView en una aplicación para iPad. La vista de tabla está vinculada con una constelación bastante complicada de otros objetos. Estoy teniendo un problema cuando lo pido para recargar una fila de la siguiente manera:reloadRowsAtIndexPaths de UITableView: (*) NSArray indexPaths no poder causar una recarga a menos que llamar dos veces?

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; 

El problema es que la fila no vuelve a cargar. Nunca hay una devolución de llamada a cellForRowAtIndexPath.

Lo más loco es que si llamo reloadRowsAtIndexPaths dos veces, la segunda llamada hace disparar la recarga:

//indexPath is an NSIndexPath with indexes 0 and 0. At the moment, this is the only cell in the table view. 
NSArray *array = [NSArray arrayWithObject:indexPath]; 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does not reload 
[self.tableView reloadRowsAtIndexPaths:array withRowAnimation:UITableViewRowAnimationNone]; // does reload 

Me pregunto si alguien más ha encontrado un error de este tipo, y si es así, ¿cuál fue ¿la causa?

+0

estás haciendo esto en un poco de hilo de fondo? – Daniel

+0

¿Tienes un caso de prueba? –

+0

Tema principal. Si por "caso de prueba", te refieres a un ejemplo simple que ilustra lo mismo, no, no tengo uno, y desearía haberlo hecho. –

Respuesta

6

reloadRowsAtIndexPaths:... sólo funciona cuando se envuelve entre medio de las llamadas a:

- (void)beginUpdates; 
- (void)endUpdates; 

Fuera de eso, el comportamiento no está definido. (y como has descubierto, bastante poco confiable).

Editar: citar la parte pertinente de la "Tabla Guía de programación para iPhone OS":

para animar una inserción por lotes y eliminación de filas y secciones, llamar a los métodos de inserción y supresión dentro de un bloque de animación definida por llamadas sucesivas a beginUpdates y endUpdates. Si no llama a los métodos de inserción y eliminación dentro de este bloque, los índices de fila y sección pueden no ser válidos. beginUpdates ... los bloques endUpdates no se pueden encajar.

Al final de un bloque, es decir, después de endUpdates vuelve la vista de tabla-consulta su fuente de datos y delegado como de costumbre para los datos de fila y de sección. Por lo tanto, los objetos de la colección que respaldan la vista de tabla deben actualizarse para reflejar las filas o secciones nuevas o eliminadas.

ReloadSections: withRowAnimation: y reloadRowsAtIndexPaths: withRowAnimation: los métodos, que se introdujeron en iPhone OS 3.0, están relacionados con los métodos descritos anteriormente. Le permiten solicitar la vista de tabla para volver a cargar los datos de secciones y filas específicas en lugar de cargar toda la vista de tabla visible llamando a reloadData.

+0

¿estás seguro de eso?No dice explícitamente que en la documentación ... – Daniel

+1

Este problema me mató durante una semana el año pasado ... Y lo dice, pero está ** enterrado ** en la guía de programación de vista de tabla, no en el documento de referencia. – amattn

+0

agregó la parte correspondiente de los documentos de apple. Mencionan que "están relacionados con los métodos mencionados anteriormente". Este es un uso bastante ambiguo del idioma inglés, pero en la práctica significa que reloadRows ... solo funciona entre beginUpdates y endUpdates. – amattn

2

Sé que este tema es viejo, pero me encontré con el mismo problema y una solución simple. Tenía una vista de tabla y cuando llamé a reloadData y/o reloadRowsAtIndexPaths, el método tableview cellForRowAtIndexPath no se activaría.

Resulta que no había enganchado hasta mi tableview IBOutlet en Interface Builder - una vez que estaba conectado todo despedido como se esperaba. Es siempre las pequeñas cosas ...

También, como otros han mencionado, si sólo se necesita una llamada, envolviéndolo en comenzar/endUpdates no es necesario.

Cuestiones relacionadas