#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.