如何从Swift中的数组中仅删除选定的索引路径?

时间:2014-11-23 01:50:42

标签: ios arrays

我有一个可变数组:

var responseArray = ["yes", "no", "no way", "of course", "for sure", "not a chance", "positively"]

responseArray是我的表格视图的数据源,允许在编辑过程中进行多项选择。

我正在捕获选定的索引路径:

let paths = tableView.indexPathsForSelectedRows()

我可以通过indexPath返回并验证我tableView的每个选定println(paths)

我已经阅读了indexPathsForSelectedRows方法的文档,并了解它返回了一个我按行排序的索引路径数组。

我无法理解的是如何使用返回的索引路径数组从responseArray中删除表视图中选择删除的每一行的数据。

在阅读了一些文档之后,我是否认为我无法从“responseArray”中删除任何数据,因为我在其上进行了枚举?例如:

@IBAction func deleteButtonPressed(sender: AnyObject) {
    if responseArray.count > 0 {
        if let paths = self.tableView.indexPathsForSelectedRows() {
            var sortedArray = paths.sorted({$0.row < $1.row})
            // Remove index paths from responseArray
            for i in sortedArray {
                responseArray.removeAtIndex(i.row)
            }
            self.tableView.reloadData()
        }
    }
}

我可以逐个从表视图中删除每一行,但是当我选择第一行和最后一行,所有行或任何其他行的组合进行删除时,我得到fatal error: Array index out of range。但是,如果我选择两个相邻的行进行删除,则会实现所需的结果,并从表视图中删除这两行。

我知道有些东西是我遗漏的,但作为一名新程序员,我现在已经无法解决这个问题三天了。我做得不对的是什么?

3 个答案:

答案 0 :(得分:2)

这是你的数组:[A,B,C,D]

假设您要分别删除索引0和3处的A和D,一次删除一个:

deleteAtIndex(0)给出:[B,C,D]

deleteAtIndex(3)给出:超出范围的异常

编辑: 好的,为了避免使事情变得复杂,为什么不只是总是通过反转排序来删除最高索引{$1.row < $0.row}

答案 1 :(得分:1)

为了将来参考,除了已经给出的答案之外,您可以通过撤消所选索引来进一步简化它:

@IBAction func deleteButtonPressed(sender: AnyObject) {
    self.tableView.selectedRowIndexes.reverse().forEach { x in
        responseArray.removeAtIndex(x)
    }
    self.tableView.reloadData()
}

答案 2 :(得分:0)

由于您的路径数组已排序,您知道每次从数组中删除元素时,较高的索引现在将比它们少一个。您可以简单地保持递增偏移量以应用于删除 -

@IBAction func deleteButtonPressed(sender: AnyObject) {
    if responseArray.count > 0 {
        if let paths = self.tableView.indexPathsForSelectedRows() {

            var sortedArray = paths.sorted({$0.row < $1.row})
            var offset=0;
            // Remove index paths from responseArray
            for i in sortedArray {
                responseArray.removeAtIndex(i.row-offset)
                offset++
            }
            self.tableView.reloadData()
        }
    }
}