在按钮操作不起作用时动态更改集合视图单元格背景颜色

问题描述 投票:0回答:3

我尝试更改按钮操作上特定单元格的背景颜色。单元格的颜色正在改变,但是我滚动这个集合查看单元格的颜色从原始位置错位

当我滚动这个包含问题编号的集合视图时,该控件中的颜色位置错位,如下图所示

我如何处理集合视图单元格颜色永远不会自动改变其位置的问题。

这是我单击按钮更改颜色的代码:

let indexs = IndexPath(row: currentQuestion, section: 0)
let celi = questionNumberCollection.cellForItem(at: indexs)
celi?.backgroundColor = .blue
swift uicollectionview uicollectionviewcell
3个回答
3
投票

问题是

您正在更改单元格的背景颜色,但您没有在模型中的任何位置维护单元格的状态,这在滚动时重复使用单元格的情况下很重要。

解决方案:

一个简单且标准的解决方案可能是在模型中维护状态变量或作为单独的数组,并在 cellforRowatIndexPath 方法中更改背景颜色。

示例:

struct Question {

    var desc:String
    var mark:Int
    var status:AnsweringStatus
}

enum AnsweringStatus {
    case notAttented,correct,inCorrect
}

class ViewController:UIViewController,UICollectionViewDataSource {

    var dataSource:[Question]!


    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return dataSource.count
    }


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ShowCell", for: indexPath) as! ShowCell
        switch dataSource[indexPath.row].status {

        case .notAttented:
            cell.backgroundColor = .gray
        case .correct:
             cell.backgroundColor = .red
        case .inCorrect:
             cell.backgroundColor = .green
        }
        return cell
    }

}

仅展示了解决问题所需的部分。因此,单击按钮后,只需使用索引路径更改相应模型对象中的状态并重新加载集合视图即可完成工作。

如果这对您不起作用,请提供有关该问题的更多见解。


1
投票

我认为你的问题是 CollectionViews 和 TableView 重用单元格。

在 CollectionViewCell 类中,使用此方法将重用的 Cell 重置为默认值或颜色。

@IBAction func onButtonTappet(sender: UIButton) {

   let indexs = IndexPath(row: currentQuestion, section: 0)
   let cell = questionNumberCollection.cellForItem(at: indexs) as? MyCell
   cell?.onButtonTapped = true
}

class MyCell: UICollectionViewCell {

    var onButtonTapped: Bool = false {
        didSet { checkBackgroundColor() }
    }

    override func prepareForReuse() {
        checkBackgroundColor()
    }

    override func awakeFromNib() {
        checkBackgroundColor()
    }

    private func checkBackgroundColor() {
        self.backgroundColor = onButtonTapped ? myTappedColor : myDefaultColor
    }
}

0
投票

哈里·克里希南。很好,你的回答非常有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.