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被设置为trueperformBatchUpdatesreloadItems(at:) 运行后isExpanded 不知何故被设置回false这是问题) 再次按下标签后,isExpanded 被设置为 true performBatchUpdatesreloadItems(at:) 再次运行后,isExpandedtrue这应该在第三步发生)。

这应该是一个 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 - 表格视图中的单元格出现在另一个单元格上

Swift 3 - 已展开第一个单元格的可展开表格视图单元格

swift中的UICellView单元格布局

Swift:UITableView 单元格受到另一部分中单元格的影响

SWIFT:从自定义单元格中的 UIswitch 展开/折叠自定义单元格

带有多个单元格边框的钱包样式 Swift