Отмена выбора ячейки в cellForItemAt при выборе ячейки в didSelectItemAt - PullRequest
1 голос
/ 14 апреля 2019

У меня есть переменная 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. Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2019

Прежде всего установите 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 как необязательный и обработать его правильно.

0 голосов
/ 14 апреля 2019

Прежде всего, вам не нужно переопределять 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
}
...