swift 如何处理CollectionView选择问题?

7cwmlq89  于 2023-04-04  发布在  Swift
关注(0)|答案(2)|浏览(126)

First imageSecond Image我试图创建一个集合视图,当选中时,它的背景是青色的。但是当我选择第一个时,它的其他地方变成了蓝色。例如,当我选择第一个单元格时,第一个单元格变成了青色,但是即使我没有选择其他索引,每3个索引中就有一个单元格变成了蓝色,它是这样的,我怎么解决这个问题呢?

var lastIndex: IndexPath = [1, 0]
enter image description here
 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as? LocationViewCell
        cell?.backView.backgroundColor = UIColor.cyan
        
        print(indexPath)
        
        if self.lastIndex != indexPath{
            cell?.backView.backgroundColor = .cyan
        }
        let cell2 = collectionView.cellForItem(at: self.lastIndex) as? LocationViewCell
        

        cell2?.backView.backgroundColor = .white
        
        self.lastIndex = indexPath

      
        
    }
9jyewag0

9jyewag01#

你可以使用“didSelectItemAt”方法来控制选中的单元格,并使用“didDeselectItemAt”方法来控制其余的单元格。我在这里给出了一个演示代码,可能会对你有所帮助。

extension ViewController: UICollectionViewDelegate {
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "LocationViewCell", for: indexPath) as! LocationViewCell
        cell.backgroundColor = UIColor.white // All the cell will have white background by default
    }
    
    // For selected cell
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        cell!.backgroundColor = UIColor.cyan // Selcted cell will have cyan bakground
    }
    
    // For not selected cells
    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        cell!.backgroundColor = UIColor.white // Rest of the cells, which are not selected will have white background
    } 
}
mwkjh3gx

mwkjh3gx2#

这是因为dequeueReusableCell总是重复使用单元格。我的意思是,当你滚动到右侧时,它会使用已经滚动过的左侧单元格。因此,它会显示留下的绿色单元格。
所以要解决这个问题,你必须去你的LocationViewCell和这段代码,

override func prepareForReuse() {
        backView.backgroundColor = .white
}

相关问题