iOS 10错误:UICollectionView接收到具有不存在的索引路径的单元格的布局属性

cma*_*era 63 ios uicollectionview uicollectionviewlayout ios10

在iOS 10的设备上运行我的应用程序我收到此错误:

UICollectionView接收具有不存在的索引路径的单元格的布局属性

在iOS 8和9中工作正常.我一直在研究,我发现这与集合视图布局无效有关.我试图实施该解决方案但没有成功,所以我想请求直接帮助.这是我的层次结构视图:

->Table view 
    ->Each cell of table is a custom collection view [GitHub Repo][1]
        ->Each item of collection view has another collection view
Run Code Online (Sandbox Code Playgroud)

我试过的是插入

    [self.collectionView.collectionViewLayout invalidateLayout];
Run Code Online (Sandbox Code Playgroud)

在里面

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
Run Code Online (Sandbox Code Playgroud)

两个集合视图.

我也尝试在重新加载数据之前使布局无效,不起作用......

有人能给我一些指示吗?

小智 131

当collectionView中的单元格数量发生变化时,就会发生这种情况.原来我在调用reloadData后缺少invalidateLayout.添加后,我没有遇到任何更多的崩溃.Apple已经对iOS10中的collectionView进行了一些修改.我猜这就是我们在旧版本上没有遇到同样问题的原因.

这是我的最终代码:

[self.collectionView reloadData];
[self.collectionView.collectionViewLayout invalidateLayout];
Run Code Online (Sandbox Code Playgroud)

  • 它在collectionview行数增加时有效.但是当行计数减少时再次崩溃(即,当5列到10列时工作正常,但当10列到5列时崩溃). (4认同)
  • 它有所帮助,谢谢.但有谁知道,为什么它有帮助? (3认同)
  • @JayMayu我已经尝试过,但它仍然在我的应用程序中的某些视图控制器崩溃.感谢您的帮助.我很感激. (3认同)
  • 在我的情况下,我在1个tableview单元格中使用了2个collectionview.因此,为每个人分配单独的UICollectionViewFlowLayout解决了这个奇怪的崩溃. (3认同)
  • 我遇到和@JayMayu一样的经历.当计数下降时我崩溃了. (2认同)

Art*_*urC 45

当您有自定义布局时,请记住在覆盖prepare func时清除缓存(UICollectionViewLayoutAttributes)

    override func prepare() {
       super.prepare()
       cache.removeAll()
    }
Run Code Online (Sandbox Code Playgroud)

  • @ user6520705在你的布局类中,你应该覆盖prepare func,你在这里填充[UICollectionViewLayoutAttributes]数组.此数组是布局属性的缓存.只需在准备方法开始时清除它. (2认同)

Axi*_*mem 18

我也在同一个视图中遇到了2个collectionViews的问题,因为我在两个集合中都添加了相同的UICollectionViewFlowLayout:

let layout = UICollectionViewFlowLayout()
collectionView1.collectionViewLayout = layout
collectionView2.collectionViewLayout = layout
Run Code Online (Sandbox Code Playgroud)

当然,如果collectionView1数据发生变化,它会在重载数据时崩溃.如果这可以帮助某人.


And*_*rey 6

先前的答案会有所帮助,但是如果您使用自动调整大小的单元格,则其大小将不正确。

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

我通过替换来解决此问题

[self.collectionView reloadData];
Run Code Online (Sandbox Code Playgroud)

[self.collectionView reloadSections:indexSet];
Run Code Online (Sandbox Code Playgroud)


m8l*_*abs 5

@Katrin的回答很有帮助,但是我可以通过增加一行来获得更好的结果:

collectionView.reloadData()
collectionView.collectionViewLayout.invalidateLayout()
collectionView.layoutSubviews() // <-- here it is :)
Run Code Online (Sandbox Code Playgroud)

我现在不能说是否可以用此行重现崩溃,但我想那是一个...所以,仍然不是灵丹妙药,而是某些东西。

  • 实际上不是一个好的建议。您不应该直接调用``layoutSubviews()``。如果要强制更新布局,请在下一次图形更新之前调用setNeedsLayout()方法。如果要立即更新视图的布局,请调用layoutIfNeeded()方法。https://developer.apple.com/documentation/uikit/uiview/1622482-layoutsubviews (5认同)