CollectionView 单元格顺序在滚动时混乱

CollectionView Cell order messes up on scroll

我正在尝试像这样改变我的集合视图单元格的颜色:

但是当我向下滚动然后向上滚动时,所有单元格都会像这样重新排序:

这是我的代码:

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 100
        
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "yearlyBookshelfCell", for: indexPath) as! yearlyBookshelfCell
    cell.bookLabel.text = "\(indexPath.item)"
    if indexPath.item % 2 != 0 {               
        cell.bookView.backgroundColor = .darkGray
    }
    return cell
}    
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 1
}  
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let width  = (view.frame.width)
    return CGSize(width: view.frame.width/11, height: view.frame.width/3)
} 

这是新 iOS 开发人员和 table views/collection 视图的常见问题。

规则:当您在 cellForItemAt/cellForRowAt 方法中 return 一个单元格时,您始终需要完全配置该单元格。不要假设它是空白页。

您的 if 语句说 if indexPath.item % 2 != 0(如果项目计数是偶数)然后将背景颜色设置为灰色。

物品价值为奇数怎么办?你保留它开始时的任何颜色。我猜您的单元格以蓝色背景色开始。但是,如果这是上次使用时呈灰色的回收电池怎么办?

按照您编写代码的方式,该单元格将通过 if 语句,并且其(灰色)背景颜色不会改变..

你需要一个 else 子句:

        if indexPath.item % 2 != 0 {               
            cell.bookView.backgroundColor = .darkGray
        } else {
            cell.bookView.backgroundColor = .blue // Or whatever the default color is
        }

并且您需要为可能会更改的每个 属性 单元格执行此操作。如果每 100 个单元格周围都有一个盒子,那么如果它不是 100 个单元格中罕见的 1 个之一,则您需要编写删除该盒子的代码,否则您最终会从上次使用的时间。