J'ai une table dont les cellules contiennent des labels. Chaque fois que je supprime une cellule réutilisable, les vieilles labels persistent. J'ai été capable de les enlever avec ceci:
for(int a=[[newcell subviews]count]-1; a>=0;a--) { if([[[[newcell subviews]objectAtIndex:a]class] isSubclassOfClass:[UILabel class]]) { [[[newcell subviews] objectAtIndex:a] removeFromSuperview]; } }
Mais quand je sélectionne la cellule, je peux voir l'ancien text sur le nouveau. J'ai essayé ceci:
[[newcell.selectedBackgroundView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)]; [[newcell.backgroundView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
Mais ça n'a pas marché. Comment puis-je faire disparaître les anciennes labels de la cellule sélectionnée ainsi que la vue régulière de la cellule?
Ce type de problème a tendance à se produire lorsque vous ajoutez des sous-vues à vos cellules dans cellForRowAtIndexPath:
qu'elles soient supprimées ou nouvellement créées. Par conséquent, vous créez une nouvelle sous-vue chaque fois que la ligne est réutilisée et les anciennes sous-vues s'accumulent.
Ce que vous voulez plutôt faire est d'utiliser la même sous-vue à chaque fois, mais il suffit de définir les attributes pertinents (par exemple, labels ou couleur) à chaque fois. Consultez les réponses à Comment puis-je effacer une cellule complètement lorsque je la réutilise? pour voir quelques approches possibles.
Sous-class UITableViewCell (si ce n'est déjà fait). Remplacez prepareForReuse et supprimez les labels. Pourrait fonctionner
J'ai fait un peu ce que Yuji a suggéré. Au lieu de mettre de nouvelles labels à chaque itération, j'ai vérifié si la cellule contenait des labels et ensuite éditer les labels si elles étaient là ou les mettre si elles ne l'étaient pas. Le code va comme ceci:
if([[newcell.contentView subviews] count]>=2 && [[[[newcell.contentView subviews] objectAtIndex:0]class] isSubclassOfClass:[UILabel class]] && [[[[newcell.contentView subviews] objectAtIndex:1]class] isSubclassOfClass:[UILabel class]]) { //change the text of the labels } else { //add the labels to the cell }