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