Swift -collectionView 单元格中的属性在 collectionView.performBatchUpdates > reloadItems(at:) 运行后未更新



我有一个具有isExpanded: Bool属性的collectionView单元格。当单元格首次加载时,它设置为false并且仅显示 1 行文本。如果文本有几行长,我会附加"更多..."到第一行的末尾,如果按下标签,我会展开单元格。它可以工作,但我必须按两次标签才能展开单元格,然后再次按两次才能将单元格折叠回 1 行。

我发现的是,当我第一次按下标签时,我检查是否isExpanded == false,如果是,我将其设置为true然后将单元格的 index.item 传递回协议并调用performBatchUpdates然后collectionView.reloadItems(at:)

运行后,我检查isExpanded,而不是truefalse,因此单元格不会扩展。如果我现在再次按下标签,一切都按预期的方式工作,isExpanded is true和单元格会扩展。

为什么isExpanded属性在第一次运行时设置为false,即使我将其设置为 true,但在第二次运行时它仍设置为 true?

为了更清晰一点

  1. isExpanded最初是false
  2. 点击标签,isExpanded设置为true
  3. performBatchUpdatesreloadItems(at:)运行后,isExpanded以某种方式被设置回false(这就是问题所在)
  4. 再次按下标签后isExpanded设置为true
  5. performBatchUpdatesreloadItems(at:)再次运行后isExpandedtrue(这是第 3 步应该发生的情况)。

它应该是一个 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)
}

在课堂内使用收藏视图

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 ...
}

这是一个常见的问题,依赖于取消排队的单元格来保存模型状态,例如

var isExpanded = false // should be inside model of each cell

您需要将此数据添加到单元格的模型中,并在需要更改状态时进行检查,然后重新加载

相关内容

最新更新