Не удается отменить выбор элемента в collectionView
У меня есть collectionView. При первом запуске я меняю цвет для первого элемента на черный. Проблема в том, что когда я выбираю другой элемент, я хочу, чтобы он стал черным, а первый элемент стал белым. Я использую didSelectItemAtIndexPath и didDeselectItemAtIndexPath, но если я не нажимаю на первый элемент, я не могу изменить его цвет, когда нажимаю на другой элемент. Кто-нибудь может мне помочь?
3 ответа
Установите 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()
}
}
Вы можете сделать это следующим образом.
Переопределите метод в классе UICollectionViewCell, как показано ниже
override var isSelected: Bool{
didSet{
if(self.isSelected){
yourView.backgroundColor = YourSelectedColor
}else{
yourView.backgroundColor = YourUnSelectedColor
}
}
}
Нет необходимости что-либо делать в методах didSelectItemAt или didDeSelectItemAt.
Ваш элемент из массива источника данных должен как-то знать о текущем состоянии ячейки. Например, вы можете иметь свойство вашего пользовательского объекта:
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
...
}