2017-10-13 28 views
0

我試圖在我的列表中實現批處理刪除我的代碼有點像這樣。索引超出範圍在tableView:canEditRowAt批量刪除後在TableView

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 
    if !deletedIndexPaths.isEmpty { 
     self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
    } 
} 
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
    return self.itemsArray[indexPath.row].isEditable 
} 

我得到一個索引超出範圍內實現代碼如下:canEditRowAt 是否有一批以適當方式刪除的tableView同時實施canEditRowAt

我目前的解決方法是刪除行作爲該項目被刪除

func deleteSelection() { 
    self.tableView.beginUpdates() 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      self.tableView.deleteRows(at: IndexPath(row: index, section: 0), with: .automatic) 
     } 
    } 
    self.tableView.endUpdates() 
} 

它現在的作品,但不應該原來的代碼也工作?

+0

你從哪裏得到錯誤?發佈堆棧跟蹤和代碼。 –

回答

-1

第一種情況下的示例代碼不起作用,因爲您從未告訴tableview觸發段和行計數方法。這是通過beginUpdates和endUpdates方法完成的,這就是你的第二個例子工作的原因。

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 
    tableView.beginUpdates() 
    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 
    if !deletedIndexPaths.isEmpty { 
     self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
    } 
    tableView.endUpdates() 
} 

此外,在iOS的11,蘋果推出performBatchUpdates(_:completion:)提供給我們,我們想使表視圖多個更改在一個單一的動畫操作,而不是幾個獨立動畫的方法方法。你可以在iOS 11及以上版本中使用它。

func deleteSelection() { 
    var deletedIndexPaths: [IndexPath] = [] 

    for (index, item) in self.itemsArray.enumerated().reversed() { 
     if item.isSelected { 
      self.itemsArray.remove(at: index) 
      deletedIndexPaths.append(IndexPath(row: index, section: 0)) 
     } 
    } 

    if !deletedIndexPaths.isEmpty { 
     tableView.performBatchUpdates({ 
      self.tableView.deleteRows(at: deletedIndexPaths, with: .automatic) 
     }) { (completed) in 

     } 
    } 
}