Redessiner UITableView après la mise à jour de données asynchrone
J'ai un UITableview que je charge avec des données asynchrone donc la tableview peut apparaître en l'absence de données.
J'ai fatigué ReloadData méthode, mais le tableview reste vide jusqu'à ce que je défilement de la tableview, soudain, les données s'affiche.
La même chose arrive quand je charge un tableview comme une vue détaillée et la commutation entre les éléments, le previoud éléments de données apparaît dans un premier temps et dès que j'ai faites défiler jusqu'à l'affichage de la table, il montre les données correctes.
Ma conjecture est que le ReloadData méthode fonctionne très bien, mais j'ai besoin de redessiner la tableview en quelque sorte, des suggestions sur la façon de résoudre ce problème?
/Jimmy
- Normalement, le reloadData méthode de l'actualisation de la tableview de vue. Pourriez-vous mettre de l'échantillon de votre TableViewController code?
Vous devez vous connecter pour publier un commentaire.
Vous dit que vous êtes remplissage du contenu de manière asynchrone, mais avez-vous invoquer la reloadData dans le contexte du thread principal ? (et non pas via le fil qui alimente le contenu)
Objective-C
Swift
Monotouch
dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() })
Yonels réponse est parfait lors de votre point de vue est actuellement visible à l'utilisateur (à l'e.g: l'Utilisateur appuie sur un bouton de rechargement qui remplit votre
UITableView
.)Toutefois, si vos données est chargé de manière asynchrone et votre
UITableView
est pas visible lors de la mise à jour (électronique.g: Vous ajoutez des Données à votreUITableView
dans un autre point de Vue et leUITableView
est affiché plus tard par userinput), il suffit de remplacer leUITableViewController
'sviewWillAppear
méthode.L'effet positif est que votre
UITableView
seulement recharge les données une seule fois lorsque l'utilisateur veut voir, pas lorsque de nouveaux éléments sont ajoutés.J'ai eu le même problème aujourd'hui(Storyboard dans iOS 7.0).
J'ai été en utilisant la Vue de la table à l'intérieur d'un UIViewController.Lorsque l'avis a été chargé tout fonctionnait bien; tous les délégués ont appelé.Cependant, Lorsque la source de données sous-jacente(dans mon cas,Array) a été modifiée; l'visibles les lignes de la table sont pas mis à jour.Ils ont été mis à jour; seulement quand j'ai été le défilement de l'affichage de la table.
Tout essayé; appel reloadData sur le thread Principal;recharger en appelant ViewWillAppear; rien n'a fonctionné.
La question que j'ai trouvé ; c'est que j'avais pas fait le rapprochement en storyboard; pour l'affichage de la table avec la référence de la Prise de courant.La source de données et délégué ont été mis en bien que.
Je ne pense pas que cela pourrait être la question; que tout fonctionnait bien, à la première à aller.
Espère que cela aide quelqu'un.J'avais un peu de mal fou à la trouver.
Je suppose que ce n'était pas rechargé.
Lorsque vous faites défiler les cellules de l'écran, puis...
tableView: cellForRowAtIndexPath:
...sera appelée. De sorte qu'il sera rechargé.
Je suppose que UITableView variable n'est pas validé.
Si vous utilisez UITableView comme écran principal, vous pouvez essayer ce.
[self.view reloadData];
ou
[self.tableView reloadData];
Swift 4:
Après un peu naïvement copie dans yonel de la solution et de l'appeler bon, j'ai réalisé que le fait d'appeler
performSelectorOnMainThread:withObject:waitUntilDone:
fixe le symptôme, mais pas le problème. Le plus gros problème, c'est que vous faites des mises à jour de l'INTERFACE utilisateur tout en restant dans le contexte de l'asynchrone ou thread d'arrière-plan.C'est ce que mon code ressemblait:
Quand il devrait ressembler à ceci:
Si le seulement chose que vous devez faire est d'appeler
[self.tableView reloadData]
c'est probablement bien d'utiliserperformSelectorOnMainThread:withObject:waitUntilDone:
puisqu'il accomplit le même objectif, mais tu dois aussi reconnaître ce qui se passe dans la grande image. Aussi, si vous faites plus de l'INTERFACE utilisateur de travail que de simplement recharger la table, alors l'ensemble de ce code devrait aller sur la file d'attente principale ainsi.Référence: Un exemple concis de l'utilisation de PGCD et de la gestion de l'arrière-plan vs thread principal.