使用自定义布局重新加载UICollectionView会引发错误

时间:2017-05-31 07:37:40

标签: ios swift uicollectionview uicollectionviewlayout

我正在尝试使用此tutorial在我的UICollectionView上实现Apple Watch动画。 它有一个单独的UICollectionViewLayout类用于所需的布局。

我把我的元素放在数组中,当我不得不用我以前调用的新值更新集合视图时

self.collectionView.reloadData()

但它让我跟着错误

*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3600.8.1/UICollectionViewData.m:433

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x170222520> {length = 2, path = 0 - 1}'

然后我用了

self.collectionView.collectionViewLayout.invalidateLayout()

在重新加载之前使布局无效。但我的代码仍然抛出了以前的错误。所以我尝试重新加载部分:

let indexSet = IndexSet(integer: 0)
self.collectionView.reloadSections(indexSet)

这次有时布局没有正确显示。它有一个扭曲的UI,有时它会在下面的代码行中抛出EXC_BAD_ACCESS错误:

 self.collectionView.collectionViewLayout = layout // error comes on this line

任何解决方案?请查看上面提到的教程以了解我的代码。我提到了许多答案,但我无法解决这个问题。

1 个答案:

答案 0 :(得分:0)

问题是因为即使数据为 nil ,您也会返回 UICollectionViewLayoutAttributes ,因此错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UICollectionView received layout attributes for a cell with an index path that does not exist: <NSIndexPath: 0x170222520> {length = 2, path = 0 - 1}'

tutorial中,从layoutAttributesForItemAtIndexPath调用返回属性的方法layoutAttributesForElementsInRect,其中cellCountcellCount = ROWS * COLS

假设您可能已更改numberOfItemsInSection以反映您的数据,您必须更改cellCount的条件。