J'ai mis à jour mes applications pour qu'elles fonctionnent sur iOS 7, ce qui se passe bien pour la plupart. J'ai remarqué dans plus d'une application que la reloadData
méthode de a UICollectionViewController
n'agit pas comme avant.
Je vais charger le UICollectionViewController
, remplir le UICollectionView
avec des données comme d'habitude. Cela fonctionne très bien la première fois. Cependant, si je demande de nouvelles données (remplissez le UICollectionViewDataSource
), puis que j'appelle reloadData
, il interrogera la source de données pour numberOfItemsInSection
et numberOfSectionsInCollectionView
, mais il ne semble pas appeler cellForItemAtIndexPath
le bon nombre de fois.
Si je change le code pour ne recharger qu'une seule section, cela fonctionnera correctement. Ce n'est pas un problème pour moi de les changer, mais je ne pense pas que je devrais avoir à le faire. reloadData
devrait recharger toutes les cellules visibles selon la documentation.
Quelqu'un d'autre a-t-il vu cela?
la source
reloadData
après viewDidAppear semble résoudre le problème, son horrible solution de contournement et doit être corrigé. J'espère que quelqu'un aide ici.Réponses:
Forcez ceci sur le thread principal:
la source
Dans mon cas, le nombre de cellules / sections dans la source de données n'a jamais changé et je voulais juste recharger le contenu visible à l'écran.
J'ai réussi à contourner cela en appelant:
puis:
la source
performBatchUpdates:completion:
bloc?J'ai eu exactement le même problème, mais j'ai réussi à trouver ce qui n'allait pas. Dans mon cas, j'appelais reloadData à partir de la collectionView: cellForItemAtIndexPath: ce qui ne semble pas être correct.
La distribution de l'appel de reloadData à la file d'attente principale a résolu le problème une fois pour toutes.
la source
reloadData
c'était un observateur du changement.collectionView(_:willDisplayCell:forItemAtIndexPath:)
Le rechargement de certains éléments n'a pas fonctionné pour moi. Dans mon cas, et uniquement parce que la collectionView que j'utilise n'a qu'une seule section, je recharge simplement cette section particulière. Cette fois, le contenu est correctement rechargé. Bizarre que cela ne se produise que sur iOS 7 (7.0.3)
la source
J'ai eu le même problème avec reloadData sur iOS 7. Après une longue session de débogage, j'ai trouvé le problème.
Sur iOS7, reloadData sur UICollectionView n'annule pas les mises à jour précédentes qui ne sont pas encore terminées (mises à jour qui ont appelé à l'intérieur de performBatchUpdates: block).
La meilleure solution pour résoudre ce bogue est d'arrêter toutes les mises à jour actuellement traitées et d'appeler reloadData. Je n'ai pas trouvé de moyen d'annuler ou d'arrêter un bloc de performBatchUpdates. Par conséquent, pour résoudre le bogue, j'ai enregistré un indicateur qui indique s'il existe un bloc performBatchUpdates actuellement traité. S'il n'y a pas de bloc de mise à jour actuellement traité, je peux appeler reloadData immédiatement et tout fonctionne comme prévu. S'il y a un bloc de mise à jour qui est actuellement traité, j'appellerai reloadData sur le bloc complet de performBatchUpdates.
la source
Swift 5 - 4 - 3
Swift 2
la source
J'ai aussi eu ce problème. Par coïncidence, j'ai ajouté un bouton au-dessus de la vue de la collection afin de forcer le rechargement pour les tests - et tout d'un coup, les méthodes ont commencé à être appelées.
Aussi simplement ajouter quelque chose d'aussi simple que
provoquerait l'appel des méthodes
J'ai aussi joué avec la taille du cadre - et voilà, les méthodes étaient appelées.
Il y a beaucoup de bogues avec iOS7 UICollectionView.
la source
Vous pouvez utiliser cette méthode
Vous pouvez ajouter tous les
indexPath
objets de votreUICollectionView
tableau dansarrayOfAllIndexPaths
en itérant la boucle pour toutes les sections et lignes à l'aide de la méthode ci-dessousJ'espère que vous avez compris et que cela pourra résoudre votre problème. Si vous avez besoin de plus d'explications, veuillez répondre.
la source
La solution donnée par Shaunti Fondrisi est presque parfaite. Mais un tel morceau de code ou des codes comme mettre en file d'attente l'exécution de
UICollectionView
'sreloadData()
àNSOperationQueue
'mainQueue
met en effet la synchronisation d'exécution au début de la prochaine boucle d'événement dans la boucle d'exécution, ce qui pourrait rendre leUICollectionView
mise à jour d'un simple coup.Pour résoudre ce problème. Nous devons mettre le timing d'exécution du même morceau de code à la fin de la boucle d'événement en cours mais pas au début de la suivante. Et nous pouvons y parvenir en utilisant
CFRunLoopObserver
.CFRunLoopObserver
observe toutes les activités d'attente de la source d'entrée et l'activité d'entrée et de sortie de la boucle d'exécution.Parmi ces activités,
.AfterWaiting
peut être observée lorsque la boucle d'événements en cours est sur le point de se terminer, et.BeforeWaiting
peut être observée lorsque la prochaine boucle d'événements vient de commencer.Comme il n'y a qu'une seule
NSRunLoop
instance parNSThread
etNSRunLoop
pilote exactement leNSThread
, on peut considérer que les accès proviennent du mêmeNSRunLoop
instance ne traversent toujours jamais les threads.Sur la base des points mentionnés précédemment, nous pouvons maintenant écrire le code: un répartiteur de tâches basé sur NSRunLoop:
Avec le code précédent, nous pouvons maintenant envoyer l'exécution de
UICollectionView
'sreloadData()
à la fin de la boucle d'événement actuelle par un tel morceau de code:En fait, un tel répartiteur de tâches basé sur NSRunLoop a déjà été dans l'un de mes frameworks personnels: Nest. Et voici son référentiel sur GitHub: https://github.com/WeZZard/Nest
la source
cela a fonctionné pour moi.
la source
Merci tout d'abord pour ce fil, très utile. J'ai eu un problème similaire avec Reload Data, sauf que le symptôme était que des cellules spécifiques ne pouvaient plus être sélectionnées de manière permanente alors que d'autres le pouvaient. Aucun appel à la méthode indexPathsForSelectedItems ou équivalent. Le débogage a signalé à recharger les données. J'ai essayé les deux options ci-dessus; et a fini par adopter l'option ReloadItemsAtIndexPaths car les autres options ne fonctionnaient pas dans mon cas ou faisaient clignoter la vue de la collection pendant environ une milli-seconde. Le code ci-dessous fonctionne bien:
la source
Cela m'est également arrivé dans iOS 8.1 sdk, mais je l'ai bien compris quand j'ai remarqué que même après la mise à jour,
datasource
la méthodenumberOfItemsInSection:
ne renvoyait pas le nouveau nombre d'éléments. J'ai mis à jour le décompte et je l'ai fait fonctionner.la source
Définissez-vous UICollectionView.contentInset? supprimer le bord gauche et droitInset, tout va bien après les avoir supprimés, le bogue existe toujours dans iOS8.3.
la source
Vérifiez que chacune des méthodes UICollectionView Delegate fait ce que vous attendez d'elle. Par exemple, si
ne renvoie pas une taille valide, le rechargement ne fonctionnera pas ...
la source
essayez ce code.
la source
Voici comment cela a fonctionné pour moi dans Swift 4
la source
la source