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
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];