在表视图或集合视图中删除与 IndexPath 关联的 CKRecord 的稳健方法是啥?

Posted

技术标签:

【中文标题】在表视图或集合视图中删除与 IndexPath 关联的 CKRecord 的稳健方法是啥?【英文标题】:What is a robust approach to deleting a CKRecord associated with an IndexPath in a table view or collection view?在表视图或集合视图中删除与 IndexPath 关联的 CKRecord 的稳健方法是什么? 【发布时间】:2016-04-25 15:04:19 【问题描述】:

基本上是为了“离线”删除单元格,我使用这种方法,这样每当你从右向左滑动时,用户就可以删除 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 是什么? 【参考方案1】:

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

    从给定索引处的数据源数组中获取记录,并将其从相应的CKDatabase 中删除。 从数据源数组中删除记录(您已经这样做了)。 删除表格视图中调用deleteRowsAtIndexPaths传递[indexPath]的行。

例如(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)
             
          
       )
    

【讨论】:

感谢您的回答。是的,polls 是数据源数组(我不知道如何调用它)问题是我真的不知道如何从给定索引的民意调查中获取记录。你能详细说明一下吗? 我看到的一个问题是,即使没有成功从 CloudKit 中删除记录,该行也会从表视图中删除。有几种可能的方法来处理这个问题。如果删除失败,一种可能是重新插入该行。另一个可能是仅在从 CloudKit 成功删除该行后才从表视图中删除该行。但这可能会让用户感到困惑。 @rmaddy 你是对的,谢谢。我添加了一个替代方案。 请记住,您需要确保在主线程上完成对deleteRowsAtIndexPaths 的调用。另请记住,在从 CloudKit 中删除记录期间,由于对表的其他更改,indexPath 可能会发生更改。这绝非小事。 @rmaddy 好的,但至少我添加了关键的主线程调度。

以上是关于在表视图或集合视图中删除与 IndexPath 关联的 CKRecord 的稳健方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单元格中的按钮删除集合视图中的项目?

如何从集合视图中删除项目?

如何从集合视图中删除单元格?

如何从位于集合视图单元格内的步进器中获取选定的 IndexPath?

滚动集合视图时,cellForItemAt indexPath 会出现问题

如何在集合视图中从数组显示项目到特定的 indexPath [关闭]