为什么调用 NSFetchedResultsControllerDelegate 'changeObject'

Why is NSFetchedResultsControllerDelegate 'changeObject' being called

我正在使用一些在 UITableView 中实现 NSFetchedResultsControllerDelegate 的样板代码。当我从 table 视图执行 segue 时,将调用此委托方法:

    func controller(controller: NSFetchedResultsController,
                didChangeObject anObject: AnyObject,
                atIndexPath indexPath: NSIndexPath?,
                forChangeType type: NSFetchedResultsChangeType,
                newIndexPath: NSIndexPath?) {

    guard let newIndexPath = newIndexPath else{
        fatalError("No indexPath received") // Gets to this line, thus causing a crash
    }
    switch(type){

    case .Insert:
        tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)

    case .Delete:
        tableView.deleteRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)

    case .Update:
        tableView.reloadRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)

    case .Move:
        tableView.deleteRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)
        tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Fade)
    }

}

它一直崩溃,因为正在为参数 'newIndexPath' 传入一个 nil 值。当我调用 prepareForSegue.

时,我可以通过将 fetchedResultsController 变量(负责调用委托方法的变量)设置为 nil 来绕过这个问题

为什么这个方法会在 segue 上被调用?我怎样才能传递正确的newIndexPath?我应该为此担心吗?将负责调用此委托方法的变量设置为 nil 似乎不是解决此问题的一种非常优雅的方式。

当您的 FRC 代表收到 .Delete 更改时发生:

newIndexPath The destination path for the object for insertions or moves (this value is nil for a deletion).

https://developer.apple.com/library/ios/documentation/CoreData/Reference/NSFetchedResultsControllerDelegate_Protocol/#//apple_ref/occ/intfm/NSFetchedResultsControllerDelegate/controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:

您应该在 .Move 部分将 indexPath.Delete.UpdatetableView.deleteRowsAtIndexPaths 一起使用。

.Insert 使用 newIndexPath,在 .Move 部分使用 tableView.insertRowsAtIndexPaths