Ios 如何避免错误索引超出范围?

Ios 如何避免错误索引超出范围?,ios,swift,xcode,collections,deselect,Ios,Swift,Xcode,Collections,Deselect,我尝试在集合单元格中选择多个项目,但是如果我多次点击取消选择单元格,我会得到一个错误线程1:致命错误:索引超出范围 在这一行indexPath.item==1上的selectedTimeIntervalArray.remove(位于:indexPath.item) 如何避免此错误 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let sele

我尝试集合单元格中选择多个项目,但是如果我多次点击取消选择单元格,我会得到一个错误线程1:致命错误:索引超出范围

在这一行
indexPath.item==1
上的
selectedTimeIntervalArray.remove(位于:indexPath.item)

如何避免此错误

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)
    }

}

假设您在
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
不是存储在数组中的对象的
索引

而是首先检索正确的索引:

let objectToRemove = timeIntervalArray[indexPath.item]‌
let index = selectedTimeIntervalArray.index(of: objectToRemove​)
然后将其移除:

 selectedTimeIntervalArray.remove(at: index)

如果将两个项添加到一个数组中并删除(在:0处),则该数组现在只包含一个项,因此删除(在:1处)时它将崩溃。我建议寻找一种不同的方法来存储所选状态。您不想执行
selectedTimeIntervalArray.remove(位于:indexPath.item)
。索引不正确。
indexPath.item
不是数组中对象的索引。相反,
let index=timeIntervalArray.index(of:timeIntervalArray[indexPath.item]);timeIntervalArray.remove(at:index)
谢谢,我理解。它帮助了我。