Как избежать ошибок индекса вне диапазона?
Я пытаюсь выбрать несколько элементов в collectionCell, но если я нажимаю много раз для отмены выбора ячейки, я получаю сообщение об ошибке Thread 1: Fatal error: Index out of range
На этой линии selectedTimeIntervalArray.remove(at: indexPath.item)
на indexPath.item == 1
,
Как избежать этой ошибки?
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let selectedCell = collectionView.cellForItem(at: indexPath)
if indexPath.item == 0 {
selectedBackgroundColor(cell: selectedCell!)
selectedTime = timeIntervalArray[indexPath.item]
selectedTimeLabel.text = "Время - \(selectedTime)"
selectedTimeIntervalArray.append(selectedTime)
} else if indexPath.item == 1 {
selectedBackgroundColor(cell: selectedCell!)
selectedTime2 = timeIntervalArray[indexPath.item]
selectedTimeIntervalArray.append(selectedTime2)
}
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let deselectedCell = collectionView.cellForItem(at: indexPath)
if indexPath.item == 0 {
deselectedBackgroundColor(cell: deselectedCell!)
selectedTime = ""
selectedTimeIntervalArray.remove(at: indexPath.item)
} else if indexPath.item == 1 {
deselectedBackgroundColor(cell: deselectedCell!)
selectedTime2 = ""
selectedTimeIntervalArray.remove(at: indexPath.item)
}
}
1 ответ
Допустим, вы выбираете ячейку в indexPath.item == 1
, Вы делаете тогда
selectedTime2 = timeIntervalArray[indexPath.item]
selectedTimeIntervalArray.append(selectedTime2)
Итак, мы имеем: selectedTimeIntervalArray == ["ValueOfSelectedTime2"]
Теперь мы отменили выбор элемента. Вы делаете тогда:
selectedTimeIntervalArray.remove(at: indexPath.item)
Так что вы делаете в нашем случае:
selectedTimeIntervalArray.remove(at: 1)
Индекс 1, правда? Нет, это вызывает сбой. Так как selectedTimeIntervalArray
имеет только один элемент, и он имеет индекс 0.
indexPath.item
это не index
объекта, который вы сохранили в вашем массиве.
Вместо этого сначала получите правильный индекс:
let objectToRemove = timeIntervalArray[indexPath.item]
let index = selectedTimeIntervalArray.index(of: objectToRemove)
Затем удалите это:
selectedTimeIntervalArray.remove(at: index)