iOS:UICollectionView 内容重置和 dequeueReusableCell

Posted

技术标签:

【中文标题】iOS:UICollectionView 内容重置和 dequeueReusableCell【英文标题】:iOS: UICollectionView content reset and dequeueReusableCell 【发布时间】:2019-12-20 19:28:30 【问题描述】:

好的,情况如下:

我有一个集合视图,在cellForRow 中我使用dequeueReusableCell 重用单元格。在每个单元格上,我都有一个自定义的 UIView 对象,该对象被添加为子视图。

现在,在某种情况下,我必须完全重新布局集合视图。当这种情况发生时

从数据模型中清除所有项目 为所有可见单元格的索引路径调用deleteItems 致电reloadData

此时集合视图是空的,并且没有显示任何单元格。

现在,如果我再次使用数据更新我的模型并重新加载集合视图 - 在 cellForRow dequeueReusableCell 返回重复使用的单元格/添加的 UIView 如上所述!/- 它不会初始化新的单元格对象,即使集合视图在当前更新之前是空的。我不确定这是否是预期的行为,或者我的代码中还有其他问题,但是我的问题是 - 如何达到我 reset 集合视图上的所有内容和 dequeueReusableCell 返回一个新的点初始化单元格对象。

【问题讨论】:

为什么需要一个新初始化的单元格对象?您可以在prepareForReuse 中进行任何您需要的重置。 行为正确。清除数据模型对单元池没有任何作用。您单元格中的代码和cellForItemAt 应该是无状态的;它应该始终根据模型执行配置单元所需的操作,无论它是新单元还是重用单元。 cellForRowdequeueReusableCell 获取单元格对象后,我正在初始化一个新的 UIView 实例并将其作为子视图添加到我的单元格中。为了避免每次我检查视图是否已存在时都初始化此视图,如果存在则跳过初始化新视图。但是,正如问题中所解释的,我需要有一种机制来重置所有内容。这是一个特殊事件,只有这样我才希望能够重新创建每个单元格及其对应的 UIView 实例,之后单元格重用将照常继续 - 不要在每次 cellForRow 调用时创建此视图 【参考方案1】:

我已经学会了这个艰难的方式! Petar 知道这一点可以节省一些时间 Petar 在任何集合视图/表格视图中,无论何时约束或布局结构中的任何 UI 元素发生任何变化,您都应该始终制作另一个原型单元格。这是唯一正确的方法,所以不要认为你会花更多时间来制作另一个细胞。

当我阅读您的评论时,您说您将根据要重置所有内容的那个条件启动另一个视图。只需拥有另一个具有另一个视图的单元原型并立即将其出列。

希望它能解决你的问题

【讨论】:

我不认为这是正确的。您不应该每次都初始化一个新单元格 - 这就是为什么 dequeueReusableCell 存在的原因。 你没有误解我的意思。我不是要求每次都初始化一个新单元格。我只是说,为单元格的新型 UI 设置另一个原型单元格,然后根据您的条件将该单元格出列。 @Petar 如果仍有任何困惑,请告诉我。

以上是关于iOS:UICollectionView 内容重置和 dequeueReusableCell的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 缺少将自定义 UICollectionViewCell 添加到 UICollectionView 的内容

iOS UICollectionView 记录

IOS 瀑布流UICollectionView实现

iOS:`UICollectionview`,如何通过它的`indexPath`得到一个单元格的`contentoffset`

iOS之UICollectionView详解

重置 iOS 模拟器内容并添加照片