陈旧数据的UICollectionView断言错误

use*_*700 60 uicollectionview ios7

在尝试从我的集合视图中卸载一批图像然后用另一批替换它们的过程中,我遇到了一个错误,根据原始图像或后续图像组是否多于或少于预期的替换,发生断言错误,其中说:

*** Assertion failure in -[UICollectionViewData validateLayoutInRect:], 
/SourceCache/UIKit_Sim/UIKit-2891.1/UICollectionViewData.m:341
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'UICollectionView recieved layout attributes for a cell with an 
index path that does not exist: <NSIndexPath: 0xb141c60> {length = 2, path = 0 - 2}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,现有的图像计数列表为5,新的图像列表计数为2.因此,当它到达第三个图像时 - 发生异常 - 表示UI CollectionViewDataDelegate不知道数据流中的更改.

有关如何确保UICollectionView引用新图像的任何建议?当然我叫'reloadData'......

谢谢

Dom*_*der 85

我遇到了同样的问题.代码在6.1下运行,在7.0以下崩溃我用以下方法解决了问题:

在功能

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

我打电话

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

就这样.

  • 个人认为将invalidate放在numberOfSectionsInCollectionView中是个坏主意:它可能经常被调用.仅在数据如上所述更改时调用它. (14认同)
  • 对我来说,它在我调用`reloadData`之前调用了`invalidateLayout`. (7认同)
  • 对我来说,只有从numberOfSectionsInCollectionView调用invalidateLayout才能正常工作.如果我在其他任何地方调用它(包括在主线程上重载数据方法等之前),它会崩溃. (3认同)

Mic*_*ień 22

使用iOS 10和11,这有助于:

collectionView.reloadData()
collectionView.collectionViewLayout.invalidateLayout()
Run Code Online (Sandbox Code Playgroud)

无效的布局应该是在重新加载数据之后.

  • 还帮助我在iOS 11上 (2认同)

Bep*_*ppe 21

无论多米尼克桑德user1544494是正确的,他们的解决方案是好的.

不幸的是,我注意到,如果你设置minimumLineSpacingForSectionAtIndex或者minimumInteritemSpacingForSectionAtIndex,你的collectionView的外观将会破坏(迟早).

invalidateLayoutviewWillLayoutSubviews回答这个问题,并有助于保持viewCollection的外观.

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [viewCollection.collectionViewLayout invalidateLayout];
}
Run Code Online (Sandbox Code Playgroud)

  • 把它放到我的集合视图控制器后,我有方法`-viewWillLayoutSubviews`无限调用.视图层次结构应该是什么,使它工作? (4认同)

Top*_*hul 12

这很简单.就像下面的句子一样.

'UICollectionView recieved layout attributes for a cell with an 
index path that does not exist: <NSIndexPath: 0xb141c60> {length = 2, path = 0 - 2}
Run Code Online (Sandbox Code Playgroud)

这意味着dataSouce上没有indexPath(0,2).但是,您的UICollectionViewLayout为indexPath(0,2)返回UICollectionViewLayoutAttributes.

您应该返回仅存在于dataSouce上的UICollectionViewLayoutAttributes.


我认为它已经从iOS7改变了.

  • 你是绝对正确的.必须更新基础数据源/布局. (3认同)

Joh*_*ess 10

我的问题是我UICollectionViews里面有两个UIViewController.我已经UICollectionViews连接到同一UICollectionViewLayout个子类.我通过改变每个UICollectionView有自己的UICollectionViewLayout子类来解决这个问题.

来源:这个问题