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

时间:2019-08-13 12:49:59

标签: swift uicollectionview uicollectionviewcell

我尝试通过按钮操作更改特定单元格的背景颜色。单元格的颜色正在变化,但是我在滚动此集合视图时从原来的位置first time when I click on button to change the color

错位了单元格的颜色

当我滚动包含问题编号的收藏夹视图时,此控件中的颜色位置像这张图片一样color position change after scrolling here and there

我该如何解决集合视图单元格颜色永远不会自动更改其位置的问题。

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

let indexs = IndexPath(row: currentQuestion, section: 0)
let celi = questionNumberCollection.cellForItem(at: indexs)
celi?.backgroundColor = .blue

2 个答案:

答案 0 :(得分:2)

问题是

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

解决方案:

一个简单而标准的解决方案可能是在模型中或作为单独的数组维护状态变量,并在 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 :(得分:1)

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

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

@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
    }
}