2009-05-08 13 views
5

Une aide serait grandement appréciée ici!UITableView problème d'actualisation de cellule sur réorganiser

J'ai une cellule UITableView personnalisée, composée d'une image (verte, orange ou rouge) et de deux étiquettes de différentes tailles. UITableView est piloté par un objet NSMutableArray. Le UITableView est divisé en trois sections, avec la première section contenant toutes les cellules avec l'image rouge, la deuxième section avec l'orange, la troisième section avec le vert.

J'ai implémenté la possibilité de réorganiser les cellules dans UITableView, permettant à l'utilisateur de faire glisser, par exemple, un élément avec une image rouge de la section rouge dans la section orange. Ce glissement fonctionne très bien et les données sous-jacentes sont mises à jour correctement. Je sais que c'est le cas parce que si je choisis la cellule, je vais à sa vue de détail et les données sont mises à jour.

Cependant, l'UITableView ne se met pas à jour tant que je ne vais pas au détail (ou quitte l'application) et ne reviens pas! Il se met également à jour si je fais défiler la cellule incriminée hors de la vue et la réinsère dans la vue, de sorte que le tableau contient clairement les données correctes. Je ne peux pas déclencher un rafraîchissement de vue!

J'ai essayé, après mon code pour modifier les données sous-jacentes à moveRowAtIndexPath:

[self.tableView reloadData]; 

Cependant, cela provoque une exception. Le Apple Language Reference indique en effet que reloadData ne peut pas être appelé lors de l'insertion, la suppression ou l'animation, ce qui est bien sûr ce que je fais. De plus, en essayant simplement de rafraîchir la cellule avec

[self setNeedsDisplay]; 

ne fonctionne pas (même si elle ne tombe pas en panne soit).

Des idées sur la façon dont je peux actualiser l'UITableView? Je ne trouve pas de méthode afterMoveHasBeenCompleted: ou quoi que ce soit, donc si je ne peux pas appeler reloadData pendant ma méthode moveRowAtIndexPath: alors où puis-je l'appeler ?!

Répondre

4

J'ai compris!

J'ai découvert que la solution consistait à retarder le code de rafraîchissement, ce qui l'empêchait de se bloquer.

Je mets l'appel reloadData dans une méthode distincte:

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

puis appelé avec un délai de 0,5 secondes:

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

Et ce ne est pas écrasé et rafraîchi à la place! Le délai de 0,5 sec est à peine perceptible et totalement acceptable.

J'espère que cela aide quelqu'un d'autre!

Merci

Phil

+3

Ou est-ce juste un hack sale? Y a-t-il une méthode "animationComplete" que je peux utiliser à la place? ... – h4xxr

+0

Cela semble être la meilleure façon de le faire, selon le post de gpmoore sur ce fil d'Apple Developer: http://discussions.apple.com/thread.jspa ? MessageID = 8450874 – Tim

+0

C'est frustrant mais très rassurant! Merci! – h4xxr

2

Jetez un oeil à la référence pour UITableViewDelegate. Si vous attribuez un délégué à UITableView, vous pouvez utiliser ses méthodes pour gérer les notifications que votre vue de table a effectuées. Vous utiliserez probablement l'un des

tableView:didEndEditingRowAtIndexPath:
ou
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
pour accomplir ceci.

+0

Malheureusement, tableView: didEndEditingRowAtIndexPath ne semble déclencher après l'interruption de l'action "côté swipe". Même si j'étais capable de suivre le point où l'édition s'est terminée (c'est-à-dire lorsque l'utilisateur clique sur "terminé"), les images seraient encore fausses jusqu'à ce point. L'autre méthode que vous proposez que j'utilise déjà pour autoriser le glisser-déposer vers d'autres sections uniquement. Cela s'est passé avant que je sache si j'ai besoin de rafraîchir ou non. – h4xxr