Le rechargement d'une UICollectionView à l'aide de reloadData méthode renvoie immédiatement avant le rechargement de données
J'ai besoin de savoir quand le rechargement d'une UICollectionView a été effectuée afin de configurer les cellules par la suite (parce que je ne suis pas la source de données pour les cellules - autres sage aurait déjà fait...)
J'ai essayé le code, tel que
[self.collectionView reloadData];
[self configure cells]; //BOOM! cells are nil
J'ai aussi essayé d'utiliser
[self.collectionView performBatchUpdates:^{
[self.collectionView reloadData];
} completion:^(BOOL finished) {
//notify that completed and do the configuration now
}];
mais quand je recharge les données que je reçois des accidents.
Comment puis-je recharger les données dans la collection, et seulement quand il a fini de rechargement - faire un particulier gestionnaire d'achèvement
- Je pense que j'ai rencontré simmilar question. Le problème est que les cellules sont chargés lors de layoutSubview qui a lieu lors de la prochaine exécution de la boucle de passe. Malheureusement, je n'ai pas trouver de solution pour le moment. Je me demande pourquoi UICollectionViewDelegate n'a pas des méthodes comme: - collectionView:willBeginDisplayingCell:forItemAtIndexPath: tout y est: – collectionView:didEndDisplayingCell:forItemAtIndexPath: Avez-vous résoudre ce un déjà?
- Ce qui se passe est que le lot de mises à jour de bloc attend que vous pour faire des appels pour ajouter et supprimer des lignes/sections qui correspondent avec le nouveau nombre de lignes et de sections qui se produit au cours de la recharger. Si cela ne se produit pas, une assertion est levée.
Vous devez vous connecter pour publier un commentaire.
Cela est causé par les cellules d'être ajouté au cours de layoutSubviews pas à reloadData. Depuis layoutSubviews est effectuée lors de la prochaine exécution de la boucle passe après reloadData vos cellules sont vides.
Essayez de faire cela:
J'ai eu le même problème et résolu de cette façon.
visibleCells
a 0 après un appel-reloadData
. L'appel de-layoutIfNeeded
corrigé cela. lukewar la réponse devrait être accepté.setNeedsLayout
et puislayoutIfNeeded
si vous voulez garantir une mise en cycle.De collecte de vue n'est pas pris en charge pour être rechargé animation avec l'aide de
reloadData
. Toutes les animations doivent être effectuées avec des méthodes, telles queà l'intérieur de
performBatchUpdates:
bloc. QuereloadData
méthode peut uniquement être utilisé pour des refresh, lorsque tous les éléments sont supprimés et mis de nouveau sans animation.self.collectionView?.performBatchUpdates({ self.collectionView?.deleteSections(IndexSet(arrayLiteral: 0)) self.collectionView?.insertSections(IndexSet(arrayLiteral: 0)) }, completion: nil)
Si vous souhaitez exécuter du code après votre collectionView est terminée, il est reloadData() la méthode, alors essayez ceci (Swift):
La raison pour laquelle cela fonctionne est parce que le code à l'intérieur de l'envoi de bloc est mis à l'arrière de la ligne (aussi connu comme une file d'attente). Cela signifie qu'il est en attente dans la ligne pour tout le thread principal des opérations de finition, y compris reloadData()'s méthodes, avant qu'il ne devienne c'est au tour sur le thread principal.