2016-02-26 93 views
0
//this gives me an array for multiple rows selected in a tableView. 

let rowsSelected = self.tableView.indexPathsForSelectedRows!.map{$0.row} 

打印语句给我这样的结果选择第2行和第5行..... [2.5]。我想创建一个数组,从多个表视图选择

我现在想删除当前列表中的两行。我正在努力寻找创建缩小阵列的正确概念。字典或使用NSIndexPath?

+1

从阵列中删除您的项目,并刷新你的tableview。 – vikash1307

回答

1

@ vadian的答案是接近的,但它是危险的;看到我对他的回答的评论。

要修复它,您必须首先反向要删除的索引数组。要知道为什么,在操场上运行下面几行:

let indicesToDelete = [4, 8] 
var array = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
let goodReducedArray = indicesToDelete.reverse().map { array.removeAtIndex($0) } 
goodReducedArray // prints ["i","e"] 
let badReducedArray = indicesToDelete.map { array.removeAtIndex($0) } 
badReducedArray // barfs EXC_BAD_INSTRUCTION 

所以@ vadian代码修正版本将是:

if let selectedIndexPaths = self.tableView.indexPathsForSelectedRows { 
    selectedIndexPaths.reverse().map{tableData.removeAtIndex($0.row)} 
    tableView.deleteRowsAtIndexPaths(selectedIndexPaths, withRowAnimation:.Fade) 
} 
0

假设数据源数组的名称是tableData,则可以使用这些行。

必须同时删除数据源数组中和表格视图中的项目,sortforEach函数用于删除从最高索引处开始的项目。

if let selectedIndexPaths = self.tableView.indexPathsForSelectedRows { 
    let indexes = selectedIndexPaths.map{$0.row}.sort(>) // sort descending 
    indexes.forEach{tableData.removeAtIndex($0)} 
    tableView.deleteRowsAtIndexPaths(selectedIndexPaths, withRowAnimation:.Fade) 
} 
+0

不! 'tableData.removeAtIndex()'调用不是原子的,即使它们是在'map'中调用的,因为它们中的一个或多个可能会减少数组的大小,使其比其余的一些索引更短。相反,要么*反转*要删除的路径数组(从而确保在编号较小的路径之前始终删除较高编号的路径),或者过滤数组,使其跳过要删除的索引处的元素。 – NRitH

+0

非常好的一点,谢谢,我用可靠的版本更新了我的答案 – vadian

相关问题