2017-10-13 27 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 

     } 
    } 
}