我有一个具有isExpanded: Bool
属性的collectionView单元。单元格首次加载时,将其设置为false
,并且仅显示一行文本。如果文本长几行,则在第一行的末尾附加“更多...”,如果按下标签,则展开单元格。它可以工作,但是我必须按两次标签才能展开单元格,然后再按两次以将单元格折叠回1行。
我发现的是,当我第一次按下标签时,检查是否为isExpanded == false
,如果它设置为true
,然后将单元格的索引传递给我。协议,依次呼叫performBatchUpdates
和collectionView.reloadItems(at:)
。
运行后,我检查isExpanded
,而不是true
,而是false
,因此该单元格不会扩展。现在,如果我再按一次标签,一切将按预期方式进行,isExpanded is true
和单元格将展开。
即使我将isExpanded
属性设置为true,为什么第一次将false
属性设置为isExpanded
,而在第二次遍历,属性仍然设置为true?
更加清晰
false
最初是isExpanded
true
设置为performBatchUpdates
reloadItems(at:)
和isExpanded
运行false
之后,以某种方式将其设置回isExpanded
(这是问题)true
设置为performBatchUpdates
reloadItems(at:)
和isExpanded
再次运行之后,true
是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)
}
(这应该在第三步上发生)。这应该是3步的过程,但始终是5步的过程。
折叠单元格时,会发生相同的事情,我必须按两次标签才能使其折叠。
单元格类
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")
}
}
}
并在带有CollectionView的类中
isExpanded
我尝试在协议中传递isExpanded
(我将其删除),并在类内部使用CollectionView更新了像这样的单元格func expandOrCollapseCell(indexItem: Int, isExpanded: Bool) {
if let cell = self.collectionView.cellForItem(at: indexPath) as? MyCell {
cell.isExpanded = isCellExpanded
}
// perform batchUpdates ...
}
属性,但没有区别
-Path
答案 0 :(得分:1)
这是一个普遍的问题,它依赖于已出队以保持模型状态的单元格,如
var isExpanded = false // should be inside model of each cell
您需要将此数据添加到单元的模型中,并在需要更改状态时进行检查,然后重新加载