Swift -collectionView 单元格内的属性在 collectionView.performBatchUpdates > reloadItems(at:) 运行后没有更新
Posted
技术标签:
【中文标题】Swift -collectionView 单元格内的属性在 collectionView.performBatchUpdates > reloadItems(at:) 运行后没有更新【英文标题】:Swift -Property inside collectionView cell isn't updating after collectionView.performBatchUpdates > reloadItems(at:) runs 【发布时间】:2019-04-17 22:40:13 【问题描述】:我有一个具有isExpanded: Bool
属性的collectionView 单元格。当单元格第一次加载时,它被设置为false
,它只显示一行文本。如果文本有几行长,我将“更多...”附加到第一行的末尾,如果按下标签,我会展开单元格。它可以工作,但我必须按两次标签来展开单元格,然后再按两次才能将单元格折叠回 1 行。
我发现当我第一次按下标签时,我检查是否isExpanded == false
,如果是,我将其设置为true
,然后将单元格的 index.item 传递回协议并调用performBatchUpdates
,然后是collectionView.reloadItems(at:)
。
运行后,我检查isExpanded
,而不是true
,而是false
,因此单元格不会扩展。如果我再次按下标签,现在一切正常,isExpanded is true
和单元格展开。
为什么isExpanded
属性在第一次运行时设置为false
,即使我将其设置为true,但在第二次运行时仍设置为true?
为了更清楚一点
isExpanded
最初是 false
标签被点击并且isExpanded
被设置为true
在performBatchUpdates
和reloadItems(at:)
运行后isExpanded
不知何故被设置回false
(这是问题)
再次按下标签后,isExpanded
被设置为 true
performBatchUpdates
和 reloadItems(at:)
再次运行后,isExpanded
是 true
(这应该在第三步发生)。
这应该是一个 3 步的过程,但它始终是一个 5 步的过程。
折叠单元格时会发生同样的事情,我必须按两次标签才能折叠。
细胞类
protocol: MyCellDelegate: class
func expandOrCollapseCell(indexItem: Int)
weak var delegate: MyCellDelegate?
var indexItem: Int = 0
var isExpanded = false
var review: Review?
didSet
if let review = review else return
// run logic to expand or collapse cell depending on wether isExpanded is true or false
func tapGestureForLabel()
if !isExpanded
isExpanded = true
else
isExpanded = false
delegate?.expandOrCollapseCell(indexItem: self.indexItem)
在类里面有 CollectionView
func expandOrCollapseCell(indexItem: Int)
let indexPath = IndexPath(item: indexItem, section: 0)
UIView.animate(withDuration: 0)
self.collectionView.performBatchUpdates( [weak self] in
self?.collectionView.reloadItems(at: [indexPath])
self?.collectionView.layoutIfNeeded()
) (_) in
print("finished updating cell")
我尝试在协议中传递isExpanded
(我将其删除)并在使用 CollectionView 的类中像这样更新了单元格的isExpanded
属性,但没有任何区别
func expandOrCollapseCell(indexItem: Int, isExpanded: Bool)
if let cell = self.collectionView.cellForItem(at: indexPath) as? MyCell
cell.isExpanded = isCellExpanded
// perform batchUpdates ...
【问题讨论】:
【参考方案1】:这是一个常见的问题,即依赖出队的单元来保存模型状态,如
var isExpanded = false // should be inside model of each cell
你需要将此数据添加到cell的模型中,并在需要更改状态时检查它,然后重新加载
【讨论】:
啊啊啊啊啊,其实我之前也是这么想的,但是我觉得我做错了什么。我会在其中添加一些内容,然后通过更新回复您。以上是关于Swift -collectionView 单元格内的属性在 collectionView.performBatchUpdates > reloadItems(at:) 运行后没有更新的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 - 已展开第一个单元格的可展开表格视图单元格
Swift:UITableView 单元格受到另一部分中单元格的影响