在表视图或集合视图中删除与 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?