Не удается отменить выбор элемента в 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
    ...
}
Другие вопросы по тегам