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
应该是无状态的;它应该始终根据模型执行配置单元所需的操作,无论它是新单元还是重用单元。
在cellForRow
从dequeueReusableCell
获取单元格对象后,我正在初始化一个新的 UIView 实例并将其作为子视图添加到我的单元格中。为了避免每次我检查视图是否已存在时都初始化此视图,如果存在则跳过初始化新视图。但是,正如问题中所解释的,我需要有一种机制来重置所有内容。这是一个特殊事件,只有这样我才希望能够重新创建每个单元格及其对应的 UIView
实例,之后单元格重用将照常继续 - 不要在每次 cellForRow
调用时创建此视图
【参考方案1】:
我已经学会了这个艰难的方式! Petar 知道这一点可以节省一些时间 Petar 在任何集合视图/表格视图中,无论何时约束或布局结构中的任何 UI 元素发生任何变化,您都应该始终制作另一个原型单元格。这是唯一正确的方法,所以不要认为你会花更多时间来制作另一个细胞。
当我阅读您的评论时,您说您将根据要重置所有内容的那个条件启动另一个视图。只需拥有另一个具有另一个视图的单元原型并立即将其出列。
希望它能解决你的问题
【讨论】:
我不认为这是正确的。您不应该每次都初始化一个新单元格 - 这就是为什么dequeueReusableCell
存在的原因。
你没有误解我的意思。我不是要求每次都初始化一个新单元格。我只是说,为单元格的新型 UI 设置另一个原型单元格,然后根据您的条件将该单元格出列。
@Petar 如果仍有任何困惑,请告诉我。以上是关于iOS:UICollectionView 内容重置和 dequeueReusableCell的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 缺少将自定义 UICollectionViewCell 添加到 UICollectionView 的内容
iOS:`UICollectionview`,如何通过它的`indexPath`得到一个单元格的`contentoffset`