gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:37:28 27 4
gpt4 key购买 nike

我已经使用 http://blog.radi.ws/post/32905838158/sticky-headers-for-uicollectionview-using 为 Collection View 实现了粘性部分标题作为一个起点,他们工作。

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

当我推送编辑器详细信息 View 时,更改项目的名称,使其从一个部分移动到另一个部分(想想,更改按姓氏首字母分组的联系人列表中某人的姓氏),以及然后弹回到 Collection View ,它因投诉而崩溃

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

执行流程如下:

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

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

拥有 Collection View 的 Root View Controller 捕获“名称更改”通知,重建其内部索引,然后在 Collection View 上调用 -reloadData。这一切都很好。

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

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

记录继承的基线布局,我看到了单元格以前排列的属性,而不是当前单元格排列的属性。例如,布局是针对我刚刚进行的编辑之前的安排。因此,不正确的部分和/或不正确部分中的单元格。

现在让我印象深刻的是。

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

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

然后,它就可以正常工作了。

这告诉我 Collection View 或流布局中的某些内容正在缓存结果,但前提是流布局 shouldInvalidateLayoutForBoundsChange

请注意,如果我只使用普通的 UICollectionViewFlowLayout,一切正常。

TLDR

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

有什么想法吗?

最佳答案

我通过删除 shouldInvalidateLayoutForBoundsChange: 覆盖解决了这个问题,而是在 Collection View 的委托(delegate)上实现 scrollViewDidScroll: 以使布局无效:

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

这会保留粘性 header 但会停止崩溃。

关于ios - 使用 UICollectionView 和自定义流布局时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27406361/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com