代码之家  ›  专栏  ›  技术社区  ›  Lance Samaria

运行collectionview.performbatchupdates>reloadeitems(at:)后,collectionview单元格中的swift-属性未更新

  •  0
  • Lance Samaria  · 技术社区  · 6 年前

    我有一个collectionview单元 isExpanded: Bool 财产。当单元格首次加载时,它被设置为 false 它只显示一行文本。如果文本有几行长,我会在第一行的末尾加上“更多…”,如果按下标签,我会展开单元格。它可以工作,但我必须按两次标签来展开单元格,然后再按两次将单元格折叠回一行。

    我来查的是当我第一次按下标签的时候 isExpanded == false 如果是的话,我把它设置为 true 然后在协议中传递单元格的index.item并调用 performBatchUpdates 然后 collectionView.reloadItems(at:) 是的。

    运行后我检查 isExpanded 而不是 真的 是的 所以细胞不会膨胀。如果我再按一次标签,一切都会按原计划进行 isExpanded is true 细胞会膨胀。

    为什么 已展开 属性设置为 在第一次旋转时,即使我将其设置为真,但在第二次旋转时,它仍保持为真?

    为了更清楚一点

    1. 已展开 最初
    2. 标签被点击 已展开 设置为 真的
    3. 之后 执行更新 reloadItems(at:) 已展开 不知怎的又回到了 ( 这就是问题所在 )
    4. 再次按下标签后 已展开 设置为 真的
    5. 之后 执行更新 重新加载项(位于:) 再次运行 已展开 真的 ( 这是第三步应该做的 )中。

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

    我试过传球 已展开 在协议中(我删除了它),在带有collectionview的类中,我更新了单元格的 已展开 像这样的财产但没什么区别

    func expandOrCollapseCell(indexItem: Int, isExpanded: Bool) {
    
        if let cell = self.collectionView.cellForItem(at: indexPath) as? MyCell {
    
            cell.isExpanded = isCellExpanded
        }
    
        // perform batchUpdates ...
    }
    
    0 回复  |  直到 6 年前
        1
  •  1
  •   Shehata Gamal    6 年前

    这是一个常见的问题,依赖于退出队列以保持如下模型状态的单元

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

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