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都很好。
不幸的是,我注意到,如果你设置minimumLineSpacingForSectionAtIndex
或minimumInteritemSpacingForSectionAtIndex
,你的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
。
确保你更新了你的collectionViewLayout
的contentSize
。 所以得到新的图像(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];