【问题标题】:Persistent Collection View Cell Selection持久集合视图单元格选择
【发布时间】:2023-03-19 21:10:02
【问题描述】:

请多多包涵,因为我是 Swift 编程新手。

我有一个myCollectionViewController,它是UICollectionViewController 的子类。 MyCollectionViewController 的单元格是MyCollectionViewCell 的一个类,它是一个自定义的UICollectionViewCell

我要做的是根据用户选择更改MyCollectionViewCell 的背景,并在用户滚动到MyCollectionViewController 的其他单元格时保持此选择。我尝试了两种方法来做到这一点,但到目前为止都失败了。

第一种方式是在MyCollectionViewControllerdidSelectItemAt方法中写代码:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "myCell", for: indexPath) as! MyCollectionViewCell

    cell.contentView.backgroundColor = UIColor.red
}

但是,这不起作用,单元格颜色没有改变。

我尝试这样做的另一种方法是更改​​MyCollectionViewCellisSelected 属性。

override var isSelected: Bool {
    // Change what happens when the user selects a cell

    didSet {

        if self.isSelected {
            self.contentView.backgroundColor = Colours.primary

        } else {
            self.contentView.backgroundColor = Colours.secondary

        }  
    }
}

虽然这有效,但选择并没有持续。也就是说,当用户滚动到collectionView 中的另一个单元格然后再滚动回来时,选择就消失了。

任何建议将不胜感激。

【问题讨论】:

    标签: ios swift uicollectionview uicollectionviewcell


    【解决方案1】:

    不要在didSelectItemAt 中使用 dequeue,因为它会返回单击的单元格以外的其他单元格

    var allInde = [IndexPath]()
    
      func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    
        let cell = collectionView.cellForItem(at:indexPath) as!   MyCollectionViewCell
    
        cell.contentView.backgroundColor = UIColor.red
    
        if !(allIndex.contains(indexPath)) {
            allInde.append(indexPath)
        }
    }
    

    并在 cellForItem 中检查要显示的索引路径是否在数组中并为其着色

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "id", for: indexPath as IndexPath) as! MyCollectionViewCell
    
           if allIndex.contains(indexPath) {
              cell.contentView.backgroundColor = Colours.primary
           }
           else {
              cell.contentView.backgroundColor = Colours.secondary
           }
      }
    

    //这里更新代码

    SPRAIN

    【讨论】:

    • 您能否说明我如何在最后一步进行检查?
    • 第一个部分(选中时更改颜色)正在工作。虽然颜色一直存在,但它现在正在改变其他单元格的颜色关于如何解决这个问题有什么建议吗?
    • 如果每个单元格在选择时都有不同的颜色,那么您必须在数组中保留带有 indexpath 的颜色,但如果它们只有 2 种颜色,则根据答案在它们之间切换
    • 每个单元格只能有两种颜色中的一种。但是,问题是某些单元格的索引路径是相同的(因为我的“MainCollectionView”中实际上有一个NestedCollectionView)。
    • 你能看看我的源代码吗?
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多