71 votes

iOS 10 bug: UICollectionView reçu des attributs de mise en page pour une cellule avec un chemin d'index qui n'existe pas

L'exécution de mon application dans un appareil avec iOS 10, j'obtiens cette erreur:

UICollectionView reçu des attributs de mise en page pour une cellule avec un chemin d'index qui n'existe pas

Dans iOS 8 et 9 fonctionne très bien. J'ai fait des recherches et j'ai trouvé que quelque chose est liée à invalider l'affichage de la collection mise en page. J'ai essayé de mettre en œuvre cette solution, sans succès, alors je voudrais demander de l'aide directe. C'est mon affichage de la hiérarchie:

->Table view 
    ->Each cell of table is a custom collection view [GitHub Repo][1]
        ->Each item of collection view has another collection view

Ce que j'ai tenté d'insérer

    [self.collectionView.collectionViewLayout invalidateLayout];

Dans le

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView

deux vues de la collection.

J'ai également essayé d'invalider la mise en page avant de faire un rechargement de données, ne fonctionne pas...

Quelqu'un pourrait-il me donner des directions à prendre?

141voto

Katrin Annuk Points 1192

Ce qui m'est arrivé lorsque le nombre de cellules dans collectionView changé. S'avère que j'ai été absent invalidateLayout après l'appel de reloadData. Après l'ajout, je n'ai pas connu plus de plantages. Apple a apporté quelques modifications à collectionViews dans iOS10. Je suppose que c'est la raison pour laquelle nous ne rencontrez pas de problème même sur des versions plus anciennes.

Voici mon code final:

[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];

50voto

ArturC Points 351

Lorsque vous avez mise en page personnalisée, n'oubliez pas de vider le cache (UICollectionViewLayoutAttributes) alors primordial de préparer func

    override func prepare() {
       super.prepare()
       cache.removeAll()
    }

22voto

Aximem Points 432

J'ai aussi été confronté à ce problème avec 2 collectionViews dans le même point de vue, parce que j'ai ajouté le même UICollectionViewFlowLayout dans les deux collections :

let layout = UICollectionViewFlowLayout()
collectionView1.collectionViewLayout = layout
collectionView2.collectionViewLayout = layout

Bien sûr, il se bloque sur le rechargement des données si collectionView1 modification de Données. Si cela peut aider quelqu'un.

6voto

Andrey Points 171

La réponse précédente est utile, mais si vous utilisez d'un redimensionnement automatique des cellules, leur taille sera incorrect.

 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
 layout.estimatedItemSize = CGSizeMake(60, 25);
 layout.itemSize = UICollectionViewFlowLayoutAutomaticSize;             
 self.collectionView.collectionViewLayout = layout;

- Je résoudre ce problème en remplaçant

[self.collectionView reloadData];

pour

[self.collectionView reloadSections:indexSet];

3voto

Kevin Bel Points 82

C'est pas le meilleur pour reloadData à chaque fois (Vous devez utiliser insertItems et deleteItems, et même reloadSections). Mais... après dire que, dans certains cas, il est valide, vous pouvez réellement faire ceci:

collectionView.dataSource = nil

collectionView.delegate = nil

/*... All changes here. ... */

collectionView.dataSource = self

collectionView.delegate = self

collectionView.reloadData()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X