我有collectionView。在第一次启动时,我将第一项的颜色更改为黑色。问题是当我选择另一个项目时,我希望它变成黑色,而第一个项目变成白色。我使用didSelectItemAtIndexPath 和didDeselectItemAtIndexPath,但如果我不点击第一个项目,那么当我点击另一个项目时,我无法更改它的颜色。有人能帮我吗?
问问题
1152 次
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
变化backgroundColor
cell
isSelected
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 回答