0

我有collectionView。在第一次启动时,我将第一项的颜色更改为黑色。问题是当我选择另一个项目时,我希望它变成黑色,而第一个项目变成白色。我使用didSelectItemAtIndexPath 和didDeselectItemAtIndexPath,但如果我不点击第一个项目,那么当我点击另一个项目时,我无法更改它的颜色。有人能帮我吗?

4

3 回答 3

1

您可以通过以下方式做到这一点。

覆盖 UICollectionViewCell 类中的方法,如下所示

override var isSelected: Bool{
    didSet{
        if(self.isSelected){
            yourView.backgroundColor = YourSelectedColor

        }else{
            yourView.backgroundColor = YourUnSelectedColor
        }
    }
}

不需要在 didSelectItemAt 或 didDeSelectItemAt 方法中做任何事情。

于 2018-12-18T13:10:08.590 回答
1

设置一个 selectedindexpath 并根据选定的索引路径重新加载集合视图。

class CollectionViewController: UICollectionViewController {

var selectedIndexPath : IndexPath?

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    if indexPath == selectedIndexPath {
        cell.backgroundColor = UIColor.black
    } else {
        cell.backgroundColor = UIColor.white
    }
    return cell
}

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedIndexPath = indexPath
    collectionView.reloadData()
}

}

于 2018-12-18T13:03:44.663 回答
0

您的数据源数组中的元素应该以某种方式了解单元格的当前状态。例如,您可以拥有自定义对象的属性:

var isSelected: Bool = false

didSelectItemAt方法中首先将每个元素的isSelected属性更改为false,然后为选定的元素集true,然后重新加载数据collectionView

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    dataSourceArray.forEach { $0.isSelected = false }
    dataSourceArray[indexPath.row] = true
    collectionView.reloadData()
}

然后取决于数据源数组中某些元素的属性的cellForRowAt变化backgroundColorcellisSelected

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    ...
    cell.backgroundColor = dataSourceArray[indexPath.row] ? .black : .white
    ...
}

var selectedIndexPath = IndexPath?

或者,您可以将indexPath选定的单元格保存为全局变量

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    selectedIndexPath = indexPath
    collectionView.reloadData()
}

然后在cellForRowAt你可以设置backgroundColor的单元格取决于条件是否indexPath等于selectedIndexPath

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    ...
    cell.backgroundColor = indexPath == selectedIndexPath ? .black : .white
    ...
}
于 2018-12-18T12:59:12.947 回答