我有一个具有isExpanded: Bool
属性的collectionView单元格。当单元格首次加载时,它设置为false
并且仅显示 1 行文本。如果文本有几行长,我会附加"更多..."到第一行的末尾,如果按下标签,我会展开单元格。它可以工作,但我必须按两次标签才能展开单元格,然后再次按两次才能将单元格折叠回 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 步应该发生的情况)。
它应该是一个 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
您需要将此数据添加到单元格的模型中,并在需要更改状态时进行检查,然后重新加载