Прежде всего, установите для свойства collectionView's
allowsMultipleSelection
значение true
, то есть
override func viewDidLoad() {
super.viewDidLoad()
self.step3CollectionView.allowsMultipleSelection = true
}
Теперь метод UICollectionViewDelegate
collectionView(_: shouldSelectItemAt:)
должен выглядеть следующим образом:
func collectionView(_ collectionView: UICollectionView, shouldSelectItemAt indexPath: IndexPath) -> Bool {
collectionView.indexPathsForSelectedItems?.filter({ $0.section == indexPath.section }).forEach({ collectionView.deselectItem(at: $0, animated: false) })
return true
}
Кроме того, не меняйте backgroundColour
из cell
в shouldSelectItemAt
или didSelectItemAt
в зависимости от выбора cell's
. Это делает код громоздким и избыточным.
Это должно быть сделано в подклассе UICollectionViewCell
путем переопределения свойства isSelected
.
class Step3CollectionViewCell: UICollectionViewCell {
override var isSelected: Bool {
didSet {
self.answerLabel.backgroundColor = isSelected ? HexColor.hexStringToUIColor(hex: "117577") : .white
self.answerLabel.textColor = isSelected ? .white : .black
}
}
}
С помощью приведенного выше кода также нет необходимости писать код изменения color
в методе collectionView(_:didSelectItemAt:)
. Пользовательский интерфейс для выбора и отмены cell
будет обрабатываться автоматически.
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
step3AnswerArray[indexPath.section] = (dataPageThree.step_instruction.first?.subquestions[i].subquestion_selection_answerNums![indexPath.row])!
}