Comment puis-je savoir que le UICollectionView a été complètement chargé?
Je dois faire une opération à chaque fois que UICollectionView a été complètement chargé, c'est à dire à l'époque tous les UICollectionView de la source de données /méthodes de présentation doit être appelé. Comment je le sais?? Est-il un délégué méthode pour connaître UICollectionView chargé de statut?
Vous devez vous connecter pour publier un commentaire.
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
à-viewWillDisappear:animated:
ainsi.Cela a fonctionné pour moi:
Swift 4 syntaxe:
reloadData
actualise lacollectionView
de sorte qu'il attire sur lui la source de données méthodes de nouveau... leperformBatchUpdates
a un achèvement bloc joint donc si les deux sont effectuées sur le thread principal, vous savez tout code qui mettent en place des/// collection-view finished reload
exécutera avec un nouveau et miscollectionView
C'est plutôt très simple.
Quand par exemple appeler la UICollectionView de reloadData de la méthode ou de la disposition de l'invalidateLayout méthode, vous effectuez les opérations suivantes:
Pourquoi cela fonctionne:
Le thread principal (qui est l'endroit où nous devrions faire toutes les mises à jour de l'INTERFACE utilisateur) maisons de la file d'attente principale, qui est de série dans la nature, c'est à dire qu'elle travaille dans la FIFO de la mode. Ainsi, dans l'exemple ci-dessus, le premier bloc est appelé, qui a notre
reloadData
méthode invoquée, suivie par quoi que ce soit d'autre dans le second bloc.Maintenant, le thread principal est bloquant ainsi. Donc, si vous êtes
reloadData
prend 3s à exécuter, le traitement de la seconde tranche sera reporté par ceux 3s.reloadData
. Il pourrait être, dans certains cas, le deuxième bloc async est ajouté à la file d'attente principale avant le code dansreloadData
décide de mettre quelque chose sur le thread principal.reloadData
sont synchrones. Donc, n'importe quel code vous mettre en file d'attente sur le thread principal après lareloadData
invocation se déclencher après qu'il a terminé.reloadData
maintenant place en file d'attente au chargement des cellules sur le thread principal (même si elles sont appelées par le thread principal). Si les cellules ne sont pas réellement chargé (cellForRowAtIndexPath:
n'est pas appelé) aprèsreloadData
retourne. Emballage code que vous voulez exécuter après vos cellules sont chargées dansdispatch_async(dispatch_get_main...
et l'appel que suite à votre appel àreloadData
permettra d'atteindre le résultat souhaité.Juste pour ajouter à un grand @dezinezync réponse:
Swift 3+
De faire comme ceci:
Une approche différente à l'aide de RxSwift/RxCocoa:
performBatchUpdates
ne marchait pas dans mon cas, c'est un fait. Cheers!Essayer de forcer un synchrone passe de mise en page via layoutIfNeeded() juste après la reloadData() de l'appel. Semble fonctionner pour les deux UICollectionView et UITableView sur iOS 12.
Cela fonctionne pour moi:
Comme dezinezync répondu, ce que vous avez besoin est d'envoyer à la file d'attente principale, un bloc de code après
reloadData
à partir d'unUITableView
ouUICollectionView
, et puis ce bloc sera exécuté après que les cellules de file d'attenteAfin de le rendre plus directement lors de l'utilisation, je voudrais utiliser une extension comme ceci:
Il peut également être mis en œuvre pour une
UITableView
ainsiDef ce faire:
Ensuite appeler comme ça à l'intérieur de votre VC
Assurez-vous d'utiliser la sous-classe!!
J'ai besoin d'un peu d'action à faire sur toutes les cellules visibles lors de l'affichage de la collection chargés avant qu'il soit visible pour l'utilisateur, j'ai utilisé:
Faire attention à ce que ce seront appelés lorsque vous faites défiler l'affichage de la collection, afin d'éviter cette surcharge de travail, j'ai ajouté:
et dans l'action elle-même:
L'action sera tout de même effectué plusieurs fois, comme le nombre de cellules visibles à l'état initial. mais sur tous ces appels, vous aurez le même nombre de cellules visibles (toutes). Et le drapeau booléen empêcher de courir à nouveau après que l'utilisateur a commencé à interagir avec l'affichage de la collection.
Ce travail pour moi:
C'est comment j'ai résolu le problème avec Swift 3.0:
Vous pouvez le faire comme ceci...
Essayez ceci: