(Swift)核心数据移动行 - 无效更新错误

时间:2018-05-18 17:14:51

标签: swift uitableview core-data

我正在尝试在表视图中移动包含核心数据对象的行。我收到无效的更新错误。

无效更新:第0节中的行数无效。更新后的现有部分中包含的行数(2)必须等于更新前该部分中包含的行数(2),或者减去从该部分插入或删除的行数(插入0,删除1),加上或减去移入或移出该部分的行数(0移入,0移出)。'

我不明白为什么我会这样做。我正在删除我想在源索引路径上移动的行,然后将其插入目标索引路径。

这是我的代码:

// Move fetchedResultsController objects
override func tableView(tableView: UITableView, moveRowAtIndexPath sourceIndexPath: NSIndexPath, toIndexPath destinationIndexPath: NSIndexPath) {

    let movedObject = self.fetchedResultsController.objectAtIndexPath(sourceIndexPath) as! NSManagedObject

    controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: .Delete, newIndexPath: sourceIndexPath)

    controller(self.fetchedResultsController, didChangeObject: movedObject, atIndexPath: sourceIndexPath, forChangeType: .Insert, newIndexPath: destinationIndexPath)
}

1 个答案:

答案 0 :(得分:0)

fetchedResultsController作业是监视核心数据更改并告诉UI它需要更新以匹配核心数据中现在的内容。你不能调用controller(didChangeObject:..方法; fetchedResultsController调用它们。

您应该只更新core-data中的对象,等待fetchedResultsController通知您的viewController更新。

此举更为复杂。 tableView已经更新,现在您想要更新核心数据。但是当你更新核心数据时,fetchedResultsController将会告诉你做这个动作 - 你已经做过了!因此,将fetchedResultsController设置为nil,然后更新core-data(这将是在fetch中存储对象的字段,可能是order属性或类似的东西),然后重置fetchedResultsController'代表。