Не удается отменить выбор предварительно выбранных uicollectionviewcells при allowsMultipleSelection

#ios #swift #uicollectionview

#iOS #swift #uicollectionview

Вопрос:

У меня возникли некоторые проблемы с collectionview и множественным выбором. Проблема возникает, когда я предварительно выбираю ее, тогда мне не удается отменить ее. Я создал пример проекта, чтобы кто-то мог это проверить. Я загрузил в свой профиль на github:https://github.com/ahhhv/CollectionViewSelection

Но я добавлю сюда некоторый код на случай, если кто-то уже знает ответ.

 // Cell
override public var isSelected: Bool {
    didSet {
        if isSelected {
            layer.borderWidth = 1
            layer.borderColor = UIColor.systemBlue.cgColor
            titleLabel.textColor = .systemBlue
        } else {
            layer.borderWidth = 0
            titleLabel.textColor = .black
        }

        titleLabel.accessibilityLabel = self.isSelected ? "(selectedItemText) (isSelectedText)" : selectedItemText
        titleLabel.accessibilityTraits = UIAccessibilityTraits.button
    }
}

// VC
    public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    guard let item = item else { return UICollectionViewCell() }

    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ModuleSelectorCell.reuseID, for: indexPath) as? ModuleSelectorCell {
        cell.set(item: item.items[indexPath.item])

        if item.selectionType == .exclusive {
            if let selectedItem = item.selectedItems, let first = selectedItem.first {
                if first == indexPath.item {
                    cell.isSelected = true
                }
            }
        } else {
            if let selectedItems = item.selectedItems {
                selectedItems.forEach { num in
                    if num == indexPath.item {
                        cell.isSelected = true
                    }
                }
            }
        }
        
        return cell
    }

    return UICollectionViewCell()
}
  

Я знаю, что это долгий путь, но я боролся с этим довольно долгое время.

С наилучшими пожеланиями,

Ответ №1:

Есть ли какая-либо конкретная причина для настройки isSelected внутри collectionView(_:cellForItemAt:) ? Документация Apple НЕ ПРЕДЛАГАЕТ ЭТОГО ДЕЛАТЬ.

Обсуждение

Это свойство управляет состоянием выбора только ячейки. Значение по умолчанию этого свойства равно false, что указывает на невыбранное состояние.

Обычно вы не устанавливаете значение этого свойства напрямую. Изменение значения этого свойства программно не изменяет внешний вид ячейки. Предпочтительный способ выбрать ячейку и выделить ее — использовать методы выбора объекта представления коллекции.

Итак, мое предложение будет заключаться в следующем изменении, чтобы устранить вашу проблему.

введите описание изображения здесь

Единственная проблема, с которой вам нужно справиться, заключается в том, что вы не можете избежать установки scrollPosition в selectItem(at:animated:scrollPosition) . Я думаю, если все предварительно выбранные элементы находятся в верхней части вашего представления коллекции, то передать .top его значение не будет проблемой. В противном случае вам нужно придумать лучшую стратегию. В любом случае, вы всегда можете прокрутить до верха, используя

 collectionView.setContentOffset(.zero, animated: false)
  

чтобы установить ваш collectionView параметр contentOffset.