Как избежать ошибок индекса вне диапазона?

Я пытаюсь выбрать несколько элементов в 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)
Другие вопросы по тегам