UICollectionView声明错误陈旧的数据

在试图从我的集合视图中卸载一批图像,然后将其replace为另一批的过程中,我遇到了一个错误,其中根据原始或后续图像组是否比预期replace更多或更less,说:

*** 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} 

在这种情况下,图像计数的现有列表是5,新的图像列表计数是2.所以,当它到了第三个图像 – 发生exception – 表示UI CollectionViewDataDelegate不知道数据stream中的变化。

有关如何确保新图像将被UICollectionView引用的任何build议? 当然,我已经叫'reloadData'…

谢谢

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

在函数中

 -(NSInteger) numberOfSectionsInCollectionView:(UICollectionView *)collectionView 

我打电话

 [myCollectionView.collectionViewLayout invalidateLayout]; 

就这样。

Dominic Sander和user1544494都是对的,他们的解决scheme都很好。

不幸的是,我注意到,如果你设置minimumLineSpacingForSectionAtIndexminimumInteritemSpacingForSectionAtIndex ,你的collectionView的外观将会破坏(迟早)。

viewWillLayoutSubviews放置invalidateLayout回答这个问题,并帮助保持viewCollection的外观。

 - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [viewCollection.collectionViewLayout invalidateLayout]; } 

有了iOS 10,这有助于:

 collectionView.reloadData() collectionView.collectionViewLayout.invalidateLayout() 

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

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

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

这意味着dataSouce上没有indexPath(0,2)。 但是,你的UICollectionViewLayout为indexPath(0,2)返回一个UICollectionViewLayoutAttributes。

你应该返回UICollectionViewLayoutAttributes只存在于dataSouce。


我认为这是从iOS7改变。

我的问题是,我有一个UIViewController里面有两个UICollectionViews 。 我有两个UICollectionViews连接到相同的UICollectionViewLayout子类。 我通过更改每个UICollectionView有自己的UICollectionViewLayout子类来解决这个问题。

来源: 这个问题

我通过更新我的集合视图数据源来修复这个崩溃:

 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { [collectionView.collectionViewLayout invalidateLayout]; return collectionArray.count; } 

我有同样的崩溃。

在我的应用程序中,问题是我没有用UICollectionViewLayoutAttributes清空数组。 我在prepareLayout()方法中使用它来存储每个单元格的布局属性。

var itemAttributes: Array<UICollectionViewLayoutAttributes> = Array<UICollectionViewLayoutAttributes>()

self.itemAttributes.removeAll()的第一行使用self.itemAttributes.removeAll() ,它就起作用了。

我修改集合视图的内容后遇到此问题。 在我的情况下工作的解决scheme是重新加载后使布局无效。 在重新加载之前执行此操作将不起作用。

 [collectionView reloadData]; //forces the layout attributes to be recalculated for new data [collectionView.collectionViewLayout invalidateLayout]; 

我find的解决scheme是为了确保我在layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]?创build的layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? 方法对该行有效。 以前,我正在使用( i是我的循环计数器):

 var indexPath = NSIndexPath(index: i) var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) 

但更新它使用以下解决它:

 var indexPath = NSIndexPath(forRow: i, inSection: 0)! var attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath) 

我能够通过创buildUICollectionViewFlowLayout的子类来解决这个问题,并重写此方法返回YES

 - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return YES; } 

我遇到过这个问题,这很烦人。 我的修复是忘记UICollectionViewController ,而不是使用UICollectionView里面的普通UIViewController

确保你更新了你的collectionViewLayoutcontentSize 。 所以得到新的图像(2,而不是5)后,重新计算contentSize并设置它。

我也有这个错误,并find一个解决方法。 对我来说,UICollectionView是在iOS 7下启动的,在iOS 8上完美运行。

检查这篇文章: 什么导致这个iOS崩溃? UICollectionView收到一个索引path不存在的单元格的布局属性

有两个词:自动布局。 在包含UICollectionView的视图上禁用它,对我来说,它工作。

collectionViewLayoutcaching布局属性。 在viewwillappear。 创build一个新的collectionViewLayout实例,并将其分配给collectionview.collectionViewLayout通过这种方式,所有caching的属性将在重新加载前清除您的问题可能已解决。 为我工作,特别是当您使用其他collectionViewLayout库。

我有类似的问题(使用Swift2.0,XCode 7)。

该应用程序崩溃UICollectionView received layout attributes for a cell with an index path that does not exist

在我的情况下,因为我使用了故事板,事实certificate,我忘了将在我的viewController中定义的IBOutlet与storyboard中定义的实际collectionView连接起来。 连接两个固定的问题。

我已经知道了。 如果您使用nib / xib来组织您的UITableViewCell和嵌套的UICollectionView ,则可以通过重写此方法来避免此错误。

 - (void)prepareForReuse { [super prepareForReuse]; [self.collectionView.collectionViewLayout invalidateLayout]; } 

希望能帮助到你。

这意味着dataSouce上没有indexPath(0,2)。 但是,你的UICollectionViewLayout为indexPath(0,2)返回一个UICollectionViewLayoutAttributes。 由TopChul

那就对了! 对于我来说,问题发生是因为我为两个collectionView使用相同的集合布局(实例) ! 这样两个集合View之间的布局混淆了。

在不同的集合视图之间使用不同的布局后,它工作正常。

当试图将一个集合视图复制到另一个故事板时,我遇到了类似的情况。

'UICollectionView收到一个索引path不存在的单元格的布局属性:{length = 2,path = 1 – 0}'

起初,我正在寻找一个快速解决scheme。 尝试复制粘贴各种StackOverflow答案。

但是我写了自己的布局类。 所以我试图谨慎debugging,这可能是我的实施责怪,对吧? 发现numberOfSections方法从未被调用。 收集视图假定它只有一个部分。

然后我发现视图控制器类忘记符合UICollectionViewDataSource 。 虽然dataSource被连接到故事板,但可能视图控制器类将downcast,就像if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...} if let ds = dataSource as? UICollectionViewDataSource {ds.numberOfSections...} ,这将失败默默。

所以我添加了符合UICollectionViewDataSource和一切工作正常。 我的猜测可能是不准确的。 但是,教训是每当有一个你不熟悉的错误,安定下来并理解它。 UICollectionView收到一个索引path不存在的单元格的布局属性 ,这意味着它说的是什么。 没那么难对吗? 不要试图find一个银弹,就像这里的许多答案一样。 他们都很棒,但你的代码是真正的战斗场所。

当我使用UICollectionViewFlowLayout作为CollectionView's collectionViewLayout时遇到同样的问题。

声明父viewController实现UICollectionViewDelegateFlowLayout并将其分配为collectionView的委托可以解决这个问题。

霍洛,我有同样的问题,而插入一个collectionView到另一个collectionView和reloadData在主队列。 最后我重新加载数据之前,一个新的数据转换为collectionView。

 dispatch_async(dispatch_get_main_queue(), ^{ [_collectionView reloadData]; }); _notes = notes; [_collectionView reloadData];