在collectionView.performBatchUpdates> reloadItems(at :)运行之后,collectionView单元内的Swift -Property不会更新

时间:2019-04-17 22:40:14

标签: ios swift uicollectionview uicollectionviewcell

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

我发现的是,当我第一次按下标签时,检查是否为isExpanded == false,如果它设置为true,然后将单元格的索引传递给我。协议,依次呼叫performBatchUpdatescollectionView.reloadItems(at:)

运行后,我检查isExpanded,而不是true,而是false,因此该单元格不会扩展。现在,如果我再按一次标签,一切将按预期方式进行,isExpanded is true和单元格将展开。

即使我将isExpanded属性设置为true,为什么第一次将false属性设置为isExpanded,而在第二次遍历,属性仍然设置为true?

更加清晰

  1. false最初是isExpanded
  2. 点击标签,将true设置为performBatchUpdates
  3. reloadItems(at:)isExpanded运行false之后,以某种方式将其设置回isExpanded这是问题
  4. 再次按下标签后,true设置为performBatchUpdates
  5. reloadItems(at:)isExpanded再次运行之后,trueprotocol: 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

1 个答案:

答案 0 :(得分:1)

这是一个普遍的问题,它依赖于已出队以保持模型状态的单元格,如

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

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