Question

Une aide serait grandement appréciée ici!

J'ai une cellule UITableView personnalisée, composée d'une image (verte, orange ou rouge) et de deux étiquettes de tailles de police différentes. UITableView est piloté par un NSMutableArray d'objets.

UITableView est divisé en trois sections, la première 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 glisser fonctionne très bien et les données sous-jacentes sont mises à jour correctement. Je sais que c'est le cas, car si je sélectionne la cellule, je passe à sa vue détaillée et les données sont mises à jour.

Cependant, UITableView ne met pas à jour jusqu'à ce que je vais au détail (ou quitte l'application) et retourne! Il met également à jour si je fais défiler la cellule incriminée hors de vue et de nouveau dans la vue, de sorte que le tableau contient clairement les données correctes. Je ne peux tout simplement pas déclencher d'actualisation de la vue!

J'ai essayé ce qui suit après mon code pour modifier les données sous-jacentes dans moveRowAtIndexPath:

[self.tableView reloadData];

Cependant, cela provoque une exception. La référence du langage Apple indique en fait que reloadData ne peut pas être appelé lors de l'insertion, de la suppression ou de l'animation, ce que je fais bien sûr. En outre, essayez simplement d’actualiser la cellule avec

[self setNeedsDisplay];

ne fonctionne pas (même s'il ne plante pas non plus).

Des idées sur la façon dont je peux actualiser UITableView? Je n'arrive pas à trouver une méthode afterMoveHasBeenCompleted: ou quoi que ce soit, donc si je ne peux pas appeler reloadData lors de ma méthode moveRowAtIndexPath: alors où je l'appelle?!

Était-ce utile?

La solution

Compris !!

J'ai découvert que la solution consistait à insérer un délai dans le code d'actualisation, 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 l'a appelé avec un délai de 0,5 seconde:

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

Et il ne s'est pas écrasé mais à la place rafraîchi! Le délai de 0,5 seconde est à peine perceptible et totalement acceptable.

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

Merci

Phil

Autres conseils

Jetez un coup d'œil à la référence de UITableViewDelegate. Si vous assignez un délégué à votre UITableView, vous pouvez utiliser ses méthodes pour gérer les notifications indiquant que votre vue Table a fait quelque chose. Vous utiliserez probablement l’un des

tableView:didEndEditingRowAtIndexPath:
ou
tableView:targetIndexPathForMoveFromRowAtIndexPath:toProposedIndexPath:
pour y parvenir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top