UICollectionView单元格在选择后未更改

时间:2019-01-09 02:34:08

标签: swift uicollectionview uicollectionviewcell

在我的项目中,我有一个UICollectionView。在UICollectionView中,我有一个自定义单元格。

在“ didSelectItemAt”中选择单元格值时,我可以打印该单元格值,但是,如果我尝试在此方法中以任何方式编辑单元格,则该值不会更改。

我确定我缺少什么,任何帮助将不胜感激!

@IBOutlet weak var collectionView: UICollectionView!

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

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell

    cell.statLabel.text = statHeaders[indexPath.row]
    cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)

    return cell
}

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

    print(cell.statLabel.text)
    cell.backgroundColor = UIColor.yellow
    collectionView.reloadData()

}

当用户选择一个单元格时,代码可以正确打印indexPath的值,但是backgroundColor不会更改。

2 个答案:

答案 0 :(得分:3)

我的猜测是您正在创建一个新的cell实例,而不是使用collectionView中的那个实例

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // Change this line
    let cell = collectionView.cellForItemAtIndexPath(indexPath: indexPath)

    print(cell.statLabel.text)
    cell.backgroundColor = UIColor.yellow
    collectionView.reloadData()

}

此外,您可能应该为真相来源保留一个外部数据模型。如果您有足够的collectionViews需要滚动,则在屏幕外滚动时,您的单元格将以随机顺序重用,从而导致您未单击的单元格变为黄色。

创建一个单独的数组,例如

var selectedStatHeaders: Set<Int>()

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "customCollectionViewCell", for: indexPath) as! customCollectionViewCell

    cell.statLabel.text = statHeaders[indexPath.row]
    cell.statLabel.textColor = UIColor(red:0.31, green:0.31, blue:0.31, alpha:1.0)
    // Reset/configure cell each reload
    if selectedStatHeaders.contains(indexPath.row) { // Can also make this into a ternary
      cell.backgroundColor = UIColor.yellow
    } else {
      cell.backgroundColor = UIColor.whit
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedStatHeaders.insert(indexPath.row)
    collectionView.reloadItemsAtIndexPath(indexPath: indexpath)
}

答案 1 :(得分:0)

嗯...如果代码可以打印,但背景没有改变颜色,则没有意义。您是说从黄色变回白色吗?无论如何,这只是一种预感,但我怀疑这是因为您在设置backgroundColor更改后正在调用collectionView.reloadData()

https://developer.apple.com/documentation/uikit/uicollectionview/1618078-reloaddata

  

这将导致集合视图放弃当前可见的所有内容   项目(包括占位符)并根据当前项目重新创建项目   数据源对象的状态。