我有一个可变数组:
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
。但是,如果我选择两个相邻的行进行删除,则会实现所需的结果,并从表视图中删除这两行。
我知道有些东西是我遗漏的,但作为一名新程序员,我现在已经无法解决这个问题三天了。我做得不对的是什么?
答案 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()
}
}
}