iOS 10 UICollectionView 索引不存在问题 UICollectionView received layout attributes for a cell with an index

iOS 10 UICollectionView 索引不存在问题 UICollectionView received layout attributes for a cell with an index path that does not exist

报的错误是

iOS 10 UICollectionView 索引不存在问题 UICollectionView received layout attributes for a cell with an index

解决方法,在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];

官方文档

iOS 10 UICollectionView 索引不存在问题 UICollectionView received layout attributes for a cell with an index

翻译

总结

使当前布局无效并触发布局更新。
公告

-(无效)无效;
讨论

您可以随时调用此方法来更新布局信息。此方法使集合视图本身的布局无效,并立即返回。因此,可以从同一代码块多次调用此方法,而无需触发多个布局更新。实际布局更新发生在下一个视图布局更新周期中。
如果重写此方法,则必须在实现中的某个点调用super。

还有种方案解决

for循环添加view,当刷新页面时删除当前view的子view再添加。这个要控制好布局,适用于小型的view。

上一篇:PyQt5基础学习-QApplication.clipboard(剪切板) 1.clipboard.setText(设置剪切板的文字) 2.clipboard.text(获得剪切板文字) 3.clip


下一篇:备忘录模式-----C++实现