iOS 10 bug: UICollectionView received layout attributes for a cell with an index path that does not exist
This happened to me when number of cells in collectionView changed. Turns out I was missing invalidateLayout after calling reloadData. After adding it, I haven't experienced any more crashes. Apple has made some modifications to collectionViews in iOS10. I guess that's the reason why we are not experiencing same problem on older versions.
Here's my final code:
[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];
//Swift 4.2 Version
collectionView.reloadData()
collectionView.collectionViewLayout.invalidateLayout()
When you have custom layout, remember to clear cache (UICollectionViewLayoutAttributes) while overriding prepare func
override func prepare() {
super.prepare()
cache.removeAll()
}
I also faced this issue with 2 collectionViews in the same view because I added the same UICollectionViewFlowLayout in both collections :
let layout = UICollectionViewFlowLayout()
collectionView1.collectionViewLayout = layout
collectionView2.collectionViewLayout = layout
Of course it crashes on reload data if collectionView1 Data change. If this could help someone.
So you should do this instead
let layout1 = UICollectionViewFlowLayout()
collectionView1.collectionViewLayout = layout1
let layout2 = UICollectionViewFlowLayout()
collectionView2.collectionViewLayout = layout2
Previous answer helps, but if you use autoresizing cells, their size will be incorrect.
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.estimatedItemSize = CGSizeMake(60, 25);
layout.itemSize = UICollectionViewFlowLayoutAutomaticSize;
self.collectionView.collectionViewLayout = layout;
I solve this issues by replacing
[self.collectionView reloadData];
to
[self.collectionView reloadSections:indexSet];