根据 IndexPath 设置特定 CollectionView Cells 的背景颜色

Set Background Color of specific CollectionView Cells according to IndexPath

我对 Swift 和一般的编程还很陌生,很抱歉这个简单的问题:

我想开发一个使用(水平滚动)UICollectionView 作为界面的日历。 UICollectionView 的每个单元格都应该有一个标签,其中包含相应日期和工作日的编号。

为此,我有一个 dateArray 来存储日期对象。 setupCell- 方法是将相应的数据放在 UICollectionViewCell.

的标签上

显示星期日的单元格应使用与其他单元格不同的背景色来突出显示。

我试图在 cellForItemAt - 方法中实现此功能,但卡在那里。

我的函数如下所示:

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

        let dayFormatter = DateFormatter()
        let weekdayFormatter = DateFormatter()
        dayFormatter.dateFormat = "dd"
        weekdayFormatter.dateFormat = "EEE"

        cell.setupCell(day: dayFormatter.string(from: dateArray[indexPath.item]), weekday: weekdayFormatter.string(from: dateArray[indexPath.item]))

    
        
        if Calendar.current.component(.weekday, from: dateArray[indexPath.item]) == 1   {
            cell.backgroundColor = UIColor.gray
        }

        
        return cell
    } 

使用此功能,星期日会按计划突出显示,但前提是我不滚动。在最后滚动后,所有单元格都将突出显示。

感谢您提供的解决问题的所有提示。

UICollectionViewCell 正在重用。因此得名 dequeueReusableCell。这意味着,例如,索引 0 处的单元格与索引 30 处的单元格相同。当您将索引 0 处的单元格颜色设置为 UIColor.gray 时,30 处的单元格也将是灰色,除非您将其设置为其他颜色。因为所有的cell都要被重复使用,而且所有的cell最终都会在某个时候成为“星期天”,所以它们都会变成彩色的。

这个问题有一个简单的解决方法,不仅要为你想要的颜色设置颜色,还要反其道而行之。

例如:

if Calendar.current.component(.weekday, from: dateArray[indexPath.item]) == 1 {
    cell.backgroundColor = UIColor.gray
} else {
    cell.backgroundColor = UIColor.white
}

我自己以前没有尝试过,但似乎还有另一种方法可以实现这一点。您还可以在 UICollectionViewCell 本身中实现 ​​prepareForReuse() (docs) 方法。您可以通过将以下内容添加到单元格来执行此操作:

override func prepareForReuse() {
    super.prepareForReuse()
    backgroundColor = UIColor.white // Or set to another color you want
}

另一种方法是在您为单元格创建的 setupCell() 中设置 backgroundColor。每次重用单元格时都会调用它,因此这也是执行此操作的好地方。只需应用与上述相同的逻辑(如果星期日 -> 灰色,否则 -> 白色)。