Je dois faire une opération chaque fois que UICollectionView a été complètement chargé, c'est-à-dire qu'à ce moment-là, toutes les méthodes de source de données / disposition de UICollectionView doivent être appelées. Comment sais-je ça ?? Existe-t-il une méthode déléguée pour connaître l'état chargé de UICollectionView?
uicollectionview
delegates
reload
Jirune
la source
la source
[self.collectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
à-viewWillDisappear:animated:
aussi bien.Cela a fonctionné pour moi:
Syntaxe Swift 4:
la source
reloadData
actualise lecollectionView
pour qu'il s'appuie à nouveau sur ses méthodes de source de données ... leperformBatchUpdates
a un bloc de complétion attaché donc si les deux sont exécutés sur le thread principal, vous savez que tout code mis à la place de/// collection-view finished reload
s'exécutera avec un nouveau et présentécollectionView
C'est en fait plutôt très simple.
Lorsque vous appelez par exemple la méthode reloadData de UICollectionView ou la méthode invalidateLayout de la disposition, vous procédez comme suit:
Pourquoi cela fonctionne:
Le thread principal (où nous devons faire toutes les mises à jour de l'interface utilisateur) héberge la file d'attente principale, qui est de nature série, c'est-à-dire qu'elle fonctionne à la manière FIFO. Ainsi, dans l'exemple ci-dessus, le premier bloc est appelé, ce qui fait que notre
reloadData
méthode est invoquée, suivi de tout autre élément dans le deuxième bloc.Maintenant, le thread principal se bloque également. Donc, si vous prenez
reloadData
3s pour s'exécuter, le traitement du deuxième bloc sera différé de ces 3s.la source
reloadData
met maintenant en file d'attente le chargement des cellules sur le thread principal (même si elles sont appelées depuis le thread principal). Ainsi, les cellules ne sont pas réellement chargées (cellForRowAtIndexPath:
ne sont pas appelées) après lesreloadData
retours. Le code d'habillage que vous voulez exécuter après le chargement de vos cellulesdispatch_async(dispatch_get_main...
et l'appel après votre appel àreloadData
obtiendra le résultat souhaité.Juste pour ajouter à une excellente réponse @dezinezync:
Swift 3+
la source
Fais-le comme ça:
la source
Essayez de forcer une mise en page synchrone via layoutIfNeeded () juste après l'appel reloadData (). Semble fonctionner à la fois pour UICollectionView et UITableView sur iOS 12.
la source
Comme dezinezync a répondu, ce dont vous avez besoin est d'envoyer à la file d'attente principale un bloc de code après
reloadData
unUITableView
ouUICollectionView
, puis ce bloc sera exécuté après le retrait des cellules.Afin de rendre cela plus clair lors de l'utilisation, j'utiliserais une extension comme celle-ci:
Il peut également être mis en œuvre à un
UITableView
aussi bienla source
Une approche différente en utilisant RxSwift / RxCocoa:
la source
performBatchUpdates
ne fonctionnait pas dans mon cas, celui-ci le fait. À votre santé!Cela fonctionne pour moi:
la source
J'avais besoin d'une action à faire sur toutes les cellules visibles lorsque la vue de la collection est chargée avant qu'elle ne soit visible pour l'utilisateur, j'ai utilisé:
Faites attention que cela sera appelé lors du défilement dans la vue de la collection, donc pour éviter cette surcharge, j'ai ajouté:
et dans l'action elle-même:
L'action sera toujours exécutée 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 l'indicateur booléen l'empêchera de s'exécuter à nouveau une fois que l'utilisateur a commencé à interagir avec la vue de collection.
la source
J'ai juste fait ce qui suit pour effectuer quoi que ce soit après le rechargement de la vue de collection. Vous pouvez utiliser ce code même dans la réponse API.
la source
La meilleure solution que j'ai trouvée jusqu'à présent est de l'utiliser
CATransaction
pour gérer l'achèvement.Swift 5 :
la source
Def faites ceci:
Puis appelez comme ça dans votre VC
Assurez-vous que vous utilisez la sous-classe !!
la source
Ce travail pour moi:
la source
Rechargez simplement collectionView à l'intérieur des mises à jour par lots, puis vérifiez dans le bloc de complétion s'il est terminé ou non à l'aide du booléen "finish".
la source
Voici la seule approche qui a fonctionné pour moi.
la source
Voici comment j'ai résolu le problème avec Swift 3.0:
la source
Essaye ça:
la source
Vous pouvez faire comme ça ...
la source