在 table 视图或集合视图中删除与 IndexPath 关联的 CKRecord 的可靠方法是什么?

What is a robust approach to deleting a CKRecord associated with an IndexPath in a table view or collection view?

基本上是为了删除“离线”单元格,我使用此方法,以便无论何时从右向左滑动,用户都可以删除 tableview 单元格。

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
    if (editingStyle == .delete) {
        self.polls.remove(at: indexPath.row)
    }
}

不过,显然不影响我之前创建的单元格内容CKRecord。那么我如何才能在用户滑动删除的确切行中获取和删除 CKRecord 数据?

假设 polls 是声明为 [CKRecord] 的数据源数组,您必须做三件事。

  1. 从数据源数组中获取给定索引处的记录,并将其从适当的 CKDatabase.
  2. 中删除
  3. 从数据源数组中删除记录(您已经这样做了)。
  4. 删除调用 deleteRowsAtIndexPaths 并传递 [indexPath] 的 table 视图中的行。

例如(publicDatabase 是实际的 CKDatabase 实例):

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
       let record = polls[indexPath.row]
       publicDatabase.deleteRecordWithID(record.recordID, completionHandler: ({returnRecord, error in
          // do error handling
       })
       polls.removeAtIndex(indexPath.row)
       tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

编辑:

为了正确处理错误,您可能必须将第二步和第三步的代码放入完成块中。

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
    if editingStyle == .Delete {
       let record = polls[indexPath.row]
       publicDatabase.deleteRecordWithID(record.recordID, completionHandler: ({returnRecord, error in
          if error != nil {
             // do error handling
          } else {
             self.polls.removeAtIndex(indexPath.row)
             dispatch_async(dispatch_get_main_queue()) {
                self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
             }
          }
       })
    }
}