iOS UICollectionView received layout attributes for a cell with an index path that does not exist

时间:2021-7-3 作者:qvyue

人人有自己的位置,忘乎所以,就危险了。

前言

昨天版本提测,又到了可以写文章的时间了,想啥来啥,今天早上刚到公司就看到有几个bug在那躺着,而且还有一个有趣的,切入正题。

正文

该bug是在特定机型会导致闪退,必现,目前确定iOS 13以下必现。拿到手机后发现崩在main函数里面,错误提示是:

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

意思很明显,就是UICollectionViewCell在布局的时候数据越界,有点懵逼,先上解决方法。

情景一

查看代码中在reloadData函数之前有没有对数据进行删除操作,若有:

  • 方法一
[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];

reloadData之后将当前的布局设置失效invalidateLayout,则collectionView会重新刷新布局,不会沿用旧的布局导致获取不到数据,导致崩溃。

  • 方法二
    使用reloadSections方法,貌似reloadSectionsreloadData更快。

情景二

项目中有UICollectionViewFlowLayout的子类,重写了- (nullable NSArray *)layoutAttributesForElementsInRect:(CGRect)rect

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
    //获取到父类所返回的数组(里面放的是当前屏幕所能展示的item的结构信息)
    NSArray *superAttrs = [super layoutAttributesForElementsInRect:rect];
    if (superAttrs.count == 0) {//不加这个话,在iOS 13 以下会creash
        return superAttrs;
    }
    UICollectionViewLayoutAttributes *attri = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:self.index inSection:0]];
}

后记

记得好像iOS 13之后苹果对UICollectionView有大动作,哪位大佬有相关文章给一下,不胜感激。

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。