2009-05-08 9 views
5

¡Alguna ayuda sería muy apreciada aquí!Problema de actualización de la célula UITableView en la reorganización

Tengo una celda UITableView personalizada, que consiste en una imagen (verde, naranja o rojo) y dos etiquetas en diferentes tamaños de fuente. El UITableView es impulsado por un NSMutableArray de objetos.

La UITableView se divide en tres secciones, con la primera sección que contiene todas las celdas con la imagen roja, la segunda sección con la naranja, la tercera sección con la verde.

He implementado la capacidad de reorganizar las celdas dentro de UITableView, lo que permite al usuario arrastrar, por ejemplo, un elemento con una imagen roja desde la sección roja a la sección naranja. Este arrastre funciona de maravilla y los datos subyacentes se actualizan correctamente. Sé que este es el caso porque si selecciono la celda, voy a su vista de detalles y los datos se actualizan.

Sin embargo, el UITableView no se actualiza hasta que voy a los detalles (o salgo de la aplicación) y ¡regreso! También se actualiza si desplazo la celda ofensiva fuera de la vista y vuelve a la vista de nuevo, por lo que la matriz contiene claramente los datos correctos. ¡Simplemente no puedo activar una actualización de vista!

he intentado lo siguiente después de mi código para cambiar los datos subyacentes en moveRowAtIndexPath:

[self.tableView reloadData]; 

Sin embargo, esto provoca una excepción. De hecho, Apple Language Reference dice que no se puede llamar a ReloadData al insertar, eliminar o animar, que es, por supuesto, lo que estoy haciendo. Además, tratando sólo para refrescar la célula con

[self setNeedsDisplay]; 

no funciona (aunque no se cuelga tampoco).

¿Alguna idea sobre cómo puedo actualizar el UITableView? No puedo encontrar un método afterMoveHasBeenCompleted o algo así, así que si no puedo llamar a reloadData durante mi método moveRowAtIndexPath: ¿a dónde lo llamo?

Respuesta

4

¡Entendido!

Descubrí que la solución era retrasar el código de actualización, lo que impidió que se bloqueara.

que poner la llamada reloadData en un método separado:

- (void)refreshDisplay:(UITableView *)tableView { 
[tableView reloadData]; } 

y luego lo llamaron con un segundo de retraso 0.5:

[self performSelector:(@selector(refreshDisplay:)) withObject:(tableView) afterDelay:0.5]; 

Y no se estrelló y en su lugar refrescado! La demora de 0.5 segundos es apenas perceptible y totalmente aceptable.

Espero que esto ayude a alguien más!

Gracias

Phil

+3

¿O es esto solo un sucio truco? ¿Existe un método "animationComplete" que pueda usar en su lugar? ... – h4xxr

+0

Esa parece ser la mejor manera de hacerlo, según la publicación de gpmoore en este hilo del desarrollador de Apple: http://discussions.apple.com/thread.jspa ? messageID = 8450874 – Tim

+0

¡Eso es frustrante pero muy tranquilizador! ¡Gracias! – h4xxr

2

Eche un vistazo a la referencia de UITableViewDelegate. Si asigna a su UITableView un delegado, puede usar sus métodos para manejar las notificaciones de que su vista de tabla ha hecho algo. Probablemente use uno de

tableView:didEndEditingRowAtIndexPath:
o
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
para lograr esto.

+0

Desafortunadamente, tableView: didEndEditingRowAtIndexPath sólo parece desencadenar después de abortar la acción "de refilón". Incluso si pudiera rastrear el punto en el que finalizó la edición (es decir, cuando el usuario hace clic en "hecho"), las imágenes seguirían siendo incorrectas hasta ese momento. El otro método que sugiere que ya estoy usando para permitir arrastrar y soltar a solo otras secciones. Esto ha pasado antes de saber si necesito actualizar o no. – h4xxr

Cuestiones relacionadas