我正在寻找从表格视图中删除项目的动画。我正在使用带有CoreData的获取结果控制器。我遇到的问题是如何引发行数必须与项目数相匹配的异常。
这是我删除时收到的错误:
原因:'无效更新:第0部分中的行数无效 更新后现有部分中包含的行数(4) 必须等于之前该部分中包含的行数 更新(3),加上或减去插入或删除的行数 从该部分(0插入,0删除)和加号或减号 移入或移出该部分的行(0移入,0移出)。'
这是代码:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }
let context = appDelegate.persistentContainer.viewContext
if editingStyle == .delete {
// Delete the row from the data source
context.delete(fetchedResultsController.object(at: indexPath))
do {
try context.save()
// Animate deleted row
tableView.deleteRows(at: [indexPath], with: .fade)
} catch {
print("There was an error: \(error)")
}
}
}
谢谢。
答案 0 :(得分:0)
您还需要删除数组中的项目(或任何数据源)。
基本上,当您在UITableView中删除动画时,tableView(_:numberOfRowsInSection:)
必须返回少一个对象(或者删除的项目数量很少)
答案 1 :(得分:0)
问题是您在删除行时删除了行,然后在NSFetchedResultsControllerDelegate
告诉您时再次将其删除。您只能删除该行一次。有两种可能的解决方案。
1)删除tableView.deleteRows
fetchedResultsController委托将在从上下文中删除对象时通知viewController。因此,只需从核心数据中删除对象,然后相信内容将得到适当更新。如果你在背景中保存东西,你可能会发现一点延迟。
2)忽略委托回调
在删除对象之前设置一个bool,以忽略fetchedResultsController回调,并在保存后立即取消设置。 Apple在他们的文档中提出了这种方法。
我个人使用第一种方法,我发现它最简单。忽略fetchedResultsController更新我也很不舒服,因为如果它们变得不同步,应用程序可能会崩溃。