iOS 10 UICollectionView 索引不存在问题 UICollectionView received layout attributes for a cell with an index path that does not exist
报的错误是
解决方法,在reloadData
后添加.collectionViewLayout invalidateLayout
[self.tagCollectionView reloadData];
[self.tagCollectionView.collectionViewLayout invalidateLayout];
分析解决
奇怪的是iOS11及以上的机型是没问题的
我的页面是UITableviewCell
嵌套CollectionView
Collectionviewcell
嵌套里再嵌套CollectionView
,第一个collectionviewCell为固定宽高,第二个CollectionviewCell是高度自适应- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
///collectionviewcell大小自适应
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
CGSize size = [_titleString sizeWithAttributes:@{NSFontAttributeName : self.titleLabel.font}];
UICollectionViewLayoutAttributes *att = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
att.frame = CGRectMake(0, 0, size.width + 12, 14.5);
return att;
}
断点后,在遍历整体的CollectionView
最后一个的collectionviewCell
执行
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
后直接报错,不会执行cellForItemAtIndexPath
。
CollectionViewCell
因为复用,还保存上一个cell的页面数据,reloadData只是对data的更新,并不会执行cell的preferredLayoutAttributesFittingAttributes
就会导致不同数据,但页面显示位置错乱问题,从而报出错误。 iOS11以上reloadData
也会对页面的布局进行更新。所以要在reloadData后对cell的重新布局[self.tagCollectionView.collectionViewLayout invalidateLayout];
官方文档
翻译
总结
使当前布局无效并触发布局更新。
公告
-(无效)无效;
讨论
您可以随时调用此方法来更新布局信息。此方法使集合视图本身的布局无效,并立即返回。因此,可以从同一代码块多次调用此方法,而无需触发多个布局更新。实际布局更新发生在下一个视图布局更新周期中。
如果重写此方法,则必须在实现中的某个点调用super。
还有种方案解决
for循环添加view,当刷新页面时删除当前view
的子view
再添加。这个要控制好布局,适用于小型的view。