Erreur d’assertion UICollectionView sur les données obsolètes

En essayant de décharger un lot d’images de mon affichage de collection puis de les remplacer par un autre lot, je rencontre une erreur lorsque, selon que le groupe d’images original ou ultérieur était plus ou moins que le remplacement prévu, une erreur s’est produite. erreur d’assertion se produit qui dit:

*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /SourceCache/UIKit_Sim/UIKit-2891.1/UICollectionViewData.m:341 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView recieved layout atsortingbutes for a cell with an index path that does not exist:  {length = 2, path = 0 - 2} 

Dans ce cas, la liste existante des images comptées était 5 et la nouvelle liste de comptage des images était 2. Ainsi, quand il est arrivé à la troisième image – l’exception s’est produite – indiquant que l’interface utilisateur CollectionViewDataDelegate ne connaissait pas le changement dans le stream de données .

Des suggestions sur la façon de vous assurer que les nouvelles images seront référencées par UICollectionView? Bien sûr, j’ai appelé ‘reloadData’…

Je vous remercie

Je cours dans le même problème. Le code s’exécute sous 6.1 et tombe en panne sous 7.0 J’ai résolu le problème de la manière suivante:

Dans la fonction

 -(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView 

J’appelle

 [myCollectionView.collectionViewLayout invalidateLayout]; 

C’est tout.

Dominic Sander et user1544494 ont tous deux raison et leurs solutions sont bonnes.

Malheureusement, j’ai remarqué que si vous définissez minimumLineSpacingForSectionAtIndex ou minimumInteritemSpacingForSectionAtIndex , l’apparence de votre collectionView va se briser (tôt ou tard).

Placer invalidateLayout dans viewWillLayoutSubviews répond à cette question et aide à préserver l’apparence de viewCollection.

 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [viewCollection.collectionViewLayout invalidateLayout]; } 

Avec iOS 10 et 11, cela aide:

 collectionView.reloadData() collectionView.collectionViewLayout.invalidateLayout() 

La mise en page invalide doit être APRÈS le rechargement des données.

C’est simple. Tout comme cette phrase ci-dessous.

 'UICollectionView recieved layout atsortingbutes for a cell with an index path that does not exist:  {length = 2, path = 0 - 2} 

Cela signifie qu’il n’y a pas d’indexPath (0,2) sur dataSouce. Mais, votre UICollectionViewLayout renvoie un UICollectionViewLayoutAtsortingbutes pour indexPath (0,2).

Vous devriez retourner UICollectionViewLayoutAtsortingbutes qui n’existe que sur dataSouce.


Je pense que cela a été changé depuis iOS7.

Mon problème était que j’avais deux UICollectionViews dans un UIViewController . Et j’ai eu les deux UICollectionViews connectées à la même sous-classe UICollectionViewLayout . J’ai résolu ce problème en modifiant chaque UICollectionView pour avoir sa propre sous-classe UICollectionViewLayout .

Source: cette question

J’ai résolu ce problème en mettant à jour la source de données de la vue de collection:

 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { [collectionView.collectionViewLayout invalidateLayout]; return collectionArray.count; } 

J’ai eu le même crash.

Dans mon application, le problème était que je ne vide pas le tableau avec UICollectionViewLayoutAtsortingbutes. Je l’utilise dans la méthode prepareLayout () pour stocker l’atsortingbut de présentation pour chaque cellule.

var itemAtsortingbutes: Array = Array()

Avec juste self.itemAtsortingbutes.removeAll() dans la première ligne de prepareLayout, cela fonctionne.

J’ai rencontré ce problème après avoir modifié le contenu de la vue Collection. La solution qui fonctionnait dans mon cas était d’invalider la mise en page après le rechargement. Le faire avant le rechargement ne fonctionnera pas.

 [collectionView reloadData]; //forces the layout atsortingbutes to be recalculated for new data [collectionView.collectionViewLayout invalidateLayout]; 

La solution que j’ai trouvée consistait à assurer l’ indexPath je indexPath dans le layoutAtsortingbutesForElementsInRect(rect: CGRect) -> [AnyObject]? La méthode est valable pour la ligne. Auparavant, j’utilisais (où i suis mon compteur de boucles):

 var indexPath = NSIndexPath(index: i) var atsortingbutes = UICollectionViewLayoutAtsortingbutes(forCellWithIndexPath: indexPath) 

Mais le mettre à jour pour utiliser les solutions suivantes:

 var indexPath = NSIndexPath(forRow: i, inSection: 0)! var atsortingbutes = UICollectionViewLayoutAtsortingbutes(forCellWithIndexPath: indexPath) 

J’ai pu résoudre ce problème en créant une sous-classe de UICollectionViewFlowLayout et en UICollectionViewFlowLayout cette méthode par YES :

 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return YES; } 

J’ai rencontré ce problème et c’était assez ennuyeux. Mon correctif est d’oublier UICollectionViewController et d’utiliser à la place UIViewController régulier avec UICollectionView intérieur.

Assurez-vous de mettre à jour le contentSize de votre collectionViewLayout . Donc, après avoir obtenu de nouvelles images (2, au lieu de 5), recalculez le contentSize et réglez-le.

J’ai aussi eu ce bogue et trouvé une solution de contournement. Pour moi, le UICollectionView le lancait sous iOS 7, fonctionnant parfaitement sur iOS 8.

Consultez cet article: Qu’est-ce qui cause cet incident iOS? UICollectionView a reçu des atsortingbuts de présentation pour une cellule avec un chemin d’index qui n’existe pas

En 2 mots: mise en page automatique. Désactivez-le sur la vue contenant UICollectionView et pour moi, cela a fonctionné.

La collectionViewLayout met en cache les atsortingbuts de présentation. En vue apparaîtra. Créez une nouvelle instance de collectionViewLayout et atsortingbuez-la à collectionview.collectionViewLayout. De cette manière, tous les atsortingbuts mis en cache seront purgés avant le rechargement. Votre problème pourrait être résolu. Travaillé pour moi, surtout lorsque vous utilisez d’autres bibliothèques collectionViewLayout.

J’ai eu un problème similaire (en utilisant Swift2.0, XCode 7).

L’application est UICollectionView received layout atsortingbutes for a cell with an index path that does not exist panne avec les UICollectionView received layout atsortingbutes for a cell with an index path that does not exist

Dans mon cas, depuis que j’ai utilisé le storyboard, il s’est avéré que j’avais oublié de connecter l’IBOutlet défini dans mon viewController avec la collectionView définie dans le storyboard. Connecter les deux a résolu le problème.

Je l’ai compris. Si vous utilisez nib / xib pour organiser votre UITableViewCell et votre UITableViewCell nested, vous pouvez éviter cette erreur en remplaçant cette méthode.

 - (void)prepareForReuse { [super prepareForReuse]; [self.collectionView.collectionViewLayout invalidateLayout]; } 

J’espère que cela aide.

Cela signifie qu’il n’y a pas d’indexPath (0,2) sur dataSouce. Mais, votre UICollectionViewLayout renvoie un UICollectionViewLayoutAtsortingbutes pour indexPath (0,2). Par TopChul

C’est vrai! Pour moi, le problème est survenu car j’utilise la même présentation de collection (instance) pour deux collectionsView! Donc, cette mise en page confondue entre deux vues de collection.

Cela fonctionne bien après que j’utilise la disposition différente entre la vue de collection différente.

J’ai rencontré quelque chose de similaire en essayant de dupliquer une vue de collection dans un autre storyboard.

‘UICollectionView a reçu des atsortingbuts de présentation pour une cellule avec un chemin d’index qui n’existe pas: {length = 2, path = 1 – 0}’

Au début, je cherche une solution rapide. Essayé copier coller différentes réponses StackOverflow.

Mais j’ai écrit ma propre classe de mise en page. J’essaie donc de déboguer discrètement, cela pourrait être ma faute, n’est-ce pas? Trouvé que la méthode numberOfSections n’a jamais été appelée. La vue de collection supposait qu’elle ne comportait qu’une seule section.

Ensuite, j’ai trouvé que la classe du contrôleur de vue avait oublié de se conformer à UICollectionViewDataSource . Bien que la source de données ait été connectée au storyboard mais que la classe du contrôleur de vue soit probablement if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...} , comme if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...} if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...} , qui échouerait silencieusement.

J’ai donc ajouté la conformité à UICollectionViewDataSource et tout fonctionne bien. Ma conjecture pourrait être inexacte. Mais la leçon est que chaque fois que vous ne connaissez pas un bogue, installez-vous et comprenez-le. UICollectionView a reçu des atsortingbuts de présentation pour une cellule avec un chemin d’index qui n’existe pas , cela signifie exactement ce qu’il dit. Pas si difficile que ça? N’essayez pas de trouver une solution miracle, comme beaucoup de réponses ici. Ils sont tous excellents mais votre code est le véritable lieu de bataille.

Je rencontre le même problème lorsque j’utilise UICollectionViewFlowLayout comme CollectionView's collectionViewLayout .

Déclarez que le parent viewController implémenté UICollectionViewDelegateFlowLayout et affectez-le comme le délégué de collectionView peut résoudre ce problème.

Hollo, j’ai le même problème en insérant une collectionView dans une autre collectionView et reloadData dans la queue principale. Enfin, je reloadData avant qu’une nouvelle donnée ne soit convertie en collectionView.

 dispatch_async(dispatch_get_main_queue(), ^{ [_collectionView reloadData]; }); _notes = notes; [_collectionView reloadData];