0

J'ai un UITableView qui contient plusieurs cellules et certaines d'entre elles (celles pour les fichiers qui sont encore en train de télécharger) ont à la fois un UIActivityIndicator et un UIProgressView. Ceux des fichiers terminés utilisent une icône différente (au lieu de l'indicateur d'activité) et masquent la vue de progression.Cellules UITableView avec les deux UIActivityIndicator et UIProgressView

Cette table utilise un NSFetchedResultsController comme source de données, donc j'obtiens les mises à jour sur le modèle de données et je mets à jour le contenu.

Tout fonctionne très bien. Le problème, cependant, est la performance. Chaque fois que j'appelle reloadData mon UIActivityIndicators scintille, et ce n'est pas très lisse. Bien que je mette en cache à partir du fichier nib, reloadData devra calculer la nouvelle progression% pour le ProgressView et je ne fais rien avec le ActivityIndicator autre que le cacher si le téléchargement est terminé.

Quelqu'un a déjà essayé quelque chose de similaire? Y at-il un travail autour?

Je pensais avoir un tableau de mes références progressview et j'utilise cela au lieu d'appeler reloadData. Je ne sais pas si c'est la bonne approche.

Merci,

Fernando

Répondre

1

Lorsque vous appelez reloadData sur le UITableView, toutes les cellules de la vue de la table sont complètement rafraîchi, ré-assemblé et redessinée. Tous les anciens sont jetés. Cela signifie que toutes les sous-vues des UITableViewCells sont supprimées et recréées aussi (y compris votre UIActivityIndicator et). L'actualisation provoque le scintillement de ces vues ou peut-être le retour à leur état initial. Comme il n'y a aucun moyen de définir le cadre d'un UIActivityIndicator, votre suggestion de restaurer une certaine valeur de progression n'est tout simplement pas possible. Au lieu de cela, peut-être que vous devriez essayer de concevoir votre "refresh" pour ne pas avoir besoin d'un rafraîchissement complet de la table? Par exemple, si vous souhaitez modifier le texte d'un UITextField dans la vue, vous pouvez simplement accéder à ce champ de texte et définir la propriété text (aucune actualisation n'est requise). Ou, si vous souhaitez masquer vos indicateurs de progression, vous pouvez aller dans les instances d'objets appropriées et définir leur propriété. Vous devez concevoir votre application pour que cela soit possible. Faire des changements de cette façon évite d'avoir à recharger des cellules à partir de zéro. Outre l'avantage de résoudre votre problème, en utilisant cette méthode de mise à jour, vous devriez également voir une augmentation importante des performances. reloadData est une méthode très coûteuse à utiliser et ne devrait être utilisée que s'il est absolument nécessaire de vraiment recréer l'intégralité de UITableView à partir de zéro.

Espérons que cela aide. :)

+0

Merci beaucoup. Je vais essayer de travailler sur une méthode d'actualisation qui mettra à jour un tableau de références à mes barres de progression afin que je n'ai pas besoin d'appeler reloadData. Je vais vous dire comment ça se passe, merci encore. – cusquinho

Questions connexes