2014-11-23 67 views
0

我有一個可變數組:如何從Swift中的數組中刪除選定的索引路徑?

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

responseArray爲我的表視圖中的數據源,其允許多個選擇編輯過程中。

我捕捉選定的指數路徑:

let paths = tableView.indexPathsForSelectedRows() 

我可以返回,並各自通過運行println(paths)選擇我tableViewindexPath驗證。

我已閱讀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。但是,如果我選擇兩個相鄰的行進行刪除,則會實現所需的結果,並將這兩行從表視圖中刪除。

我知道我缺少某些東西,但作爲一名新程序員,我現在無法解決這個問題三天了。我沒做對的是什麼?

回答

2

這是你的陣列:[A,B,C,d]

比方說,你要分別刪除A和d在索引0和3,一次一個:

deleteAtIndex(0)得出:[B,C,d]

deleteAtIndex(3)給出:越界異常

編輯: 好,避免複雜的事情,爲什麼不總是通過反轉刪除指數最高的第一你的排序:{$1.row < $0.row}

+0

我肯定了解這將如何拋出異常。但是,我不知道如何使用數組一次刪除所有選定的索引,因爲該數組只有四個方法來刪除項目:'removeAll()','removeAtIndex()','removeLast()',和'removeRange()'。 – 2014-11-23 02:21:35

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

以供將來參考,除了已經給出的答案,你可以通過逆向選擇指數進一步簡化它:

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