繁体   English   中英

使用UICollectionView和自定义流布局崩溃

[英]Crash with UICollectionView and custom flow layout

我已经使用http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-作为跳跃点实现了集合视图的粘性节标题,并且它们可以正常工作。

但我看到一个非常奇怪的崩溃。

当我按下编辑器详细信息视图时,更改项目的名称,使其从一个部分移动到另一个部分(想想,更改联系人列表中按姓氏的第一个字母分组的人员的姓氏),然后弹回在收集视图中,它会因投诉而崩溃

UICollectionView received layout attributes for a cell with an index path that does not exist

这是执行流程:

在编辑器详细信息视图中,我更改项目的名称,使其从X部分移动到Y部分。

项目的模型发出“名称已更改”通知。

拥有集合视图的根视图控制器捕获“名称已更改”通知,重建其内部索引,然后在集合视图上调用-reloadData。 这一切都很好。

我点击UI中的Back按钮,发生以下流程(通过调试器和caveman NSlog调用确认)

  • numberOfSectionsInCollectionView:被调用,我的代码返回正确的节数
  • collectionView:numberOfItemsInSection:为每个部分调用,并返回正确的项目数
  • 我的自定义流布局的-layoutAttributesForElementsInRect:被调用。 我在那里做的第一件事是调用[super layoutAttributesForElementsInRect]来获得基线布局。

记录继承的基线布局我看到先前排列的单元格的属性,而不是当前单元格的属性。 例如,布局是我刚才提出的修改的安排。 因此,不正确的部分和/或单元格不正确。

现在这就是打扰我的想法。

如果我注释掉-layoutAttributesForElementsInRect的整个实现,它仍然会崩溃。 但是,如果我发表评论:

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

然后,它正常工作。

这告诉我集合视图或流布局中的某些东西是缓存结果,但仅当流布局shouldInvalidateLayoutForBoundsChange时

注意,如果我只使用一个vanilla UICollectionViewFlowLayout,一切正常。

TLDR

自定义UICollectionViewFlowLayout,如果-shouldInvalidateLayoutForBoundsChange返回YES,则从[super layoutAttributesForElementsInRect]获取过时的布局属性

有任何想法吗?

我通过删除shouldInvalidateLayoutForBoundsChange: override来解决这个问题,而是在集合视图的委托上实现scrollViewDidScroll:以使布局无效:

override func scrollViewDidScroll(scrollView: UIScrollView) {
    collectionView?.collectionViewLayout.invalidateLayout()
}

这样可以保留粘性标题但会停止崩溃。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM