使用提取的结果控制器

时间:2017-07-15 14:56:03

标签: ios swift xcode core-data

我正在寻找从表格视图中删除项目的动画。我正在使用带有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)")
        }
    }
}

谢谢。

2 个答案:

答案 0 :(得分:0)

您还需要删除数组中的项目(或任何数据源)。

基本上,当您在UITableView中删除动画时,tableView(_:numberOfRowsInSection:)必须返回少一个对象(或者删除的项目数量很少)

答案 1 :(得分:0)

问题是您在删除行时删除了行,然后在NSFetchedResultsControllerDelegate告诉您时再次将其删除。您只能删除该行一次。有两种可能的解决方案。

1)删除tableView.deleteRows

fetchedResultsController委托将在从上下文中删除对象时通知viewController。因此,只需从核心数据中删除对象,然后相信内容将得到适当更新。如果你在背景中保存东西,你可能会发现一点延迟。

2)忽略委托回调

在删除对象之前设置一个bool,以忽略fetchedResultsController回调,并在保存后立即取消设置。 Apple在他们的文档中提出了这种方法。

我个人使用第一种方法,我发现它最简单。忽略fetchedResultsController更新我也很不舒服,因为如果它们变得不同步,应用程序可能会崩溃。