从UICollectionView中删除/删除选定的单元格导致索引超出界限[有时]

时间:2017-01-15 17:03:05

标签: ios arrays swift indexoutofboundsexception

我有一个注释数组声明为:var comments: [String]我用一些字符串填充它,我还有一个UICollectionView我在其中提出注释。当我尝试从UICollectionView中删除所选单元格时,我的代码如下:

if let indexPathsForSelectedItems = collectionView.indexPathsForSelectedItems {

    for indexPath in indexPathsForSelectedItems {
        comments.remove(at: indexPath.item) //I have only one section
    }

    collectionView.deleteItems(at: indexPathsForSelectedItems)

}

问题在于,有时当我删除所选项时,它会在comments数组中创建一个越界异常。

但是,当我使用以下方法(创建一个复制数组并用其副本替换原始数组)时,不会出现问题:

var indexes: [Int] = []
for indexPath in indexPathsForSelectedItems {
    indexes.append(indexPath.item)
}
var newComments: [String] = []
for (index, comment) in comments.enumerated() {
    if !indexes.contains(index) {
        newComments.append(comment)
    }
}
comments = newComments

为什么会这样?

我正在使用Swift 3和XCode 8.2.1

1 个答案:

答案 0 :(得分:2)

排序

如果您确定 indexPathsForSelectedItems按降序排序,因此始终先删除最高索引,最终会遇到越界。删除项目将更改具有更高索引的所有数组元素的索引。

您可能想要使用indexPathsForSelectedItems.sorted(by: >)