我有一个selectedIndexPath
变量,它从先前的视图控制器中选择了indexPath
。我在当前视图控制器的backgroundColor
中获得了cell
所需的collection view
。但是,当我在集合视图中选择另一个单元格时,上一个视图控制器的选定单元格将保持不变,而不会被取消选择。因此,现在我有两个具有背景色的单元格。以下是我的代码
var selectedIndexPath = IndexPath()
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView.allowsMultipleSelection = false
self.collectionView.allowsSelection = true
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! TestCollectionViewCell
if (indexPath == selectedIndexPath)
{
cell.backgroundColor = UIColor.white
}
else
{
cell.backgroundColor = UIColor.clear
}
collectionView.allowsMultipleSelection = false
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.white
collectionView.allowsMultipleSelection = false
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)
{
let cell = collectionView.cellForItem(at: indexPath)
cell?.backgroundColor = UIColor.clear
collectionView.allowsMultipleSelection = false
}
当我deselect
中的cellForItemAt
新单元格时,如何select
didSelectItemAt
中的单元格。预先感谢。
答案 0 :(得分:4)
首先在Interface Builder中设置allowsMultipleSelection
并删除在代码中对其进行设置的所有重复出现
您必须更新selectedIndexPath
变量。直接操作单元始终是个坏主意。
重新加载单元格更加可靠。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
guard selectedIndexPath != indexPath else { return }
let indexPathsToUpdate = [selectedIndexPath, indexPath]
selectedIndexPath = indexPath
tableView.reloadRows(at: indexPathsToUpdate, with: .none)
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)
{
guard selectedIndexPath == indexPath else { return }
selectedIndexPath = IndexPath()
tableView.reloadRows(at: [indexPath], with: .none)
}
只有一个问题:如果要选择一个空选项,则必须将selectedIndexPath
声明为可选并正确处理。
答案 1 :(得分:0)
首先,您无需为此覆盖didDeselect。您需要做的就是在 didSelectItem 中选择当前项目的同时取消选择先前选择的项目。为此,您可以选择将单元格中的状态维护为:
func changeToSelectedState() {
self.backgroundColor = UIColor.white
}
func changeToUnselectedState() {
self.backgroundColor = UIColor.clear
}
或者您可以选择在控制器本身中编写相同的内容。然后,您需要按照以下方式进行取消选择和选择。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
{
let previousSelectedCell = collectionView.cellForItem(at: selectedIndexPath)
previousSelectedCell.changeToUnselectedState()
let currentCell = collectionView.cellForItem(at: indexPath)
currentCell.changeToSelectedState()
selectedIndexPath = indexPath
}