如何在不使用内置撤消管理器的情况下撤消NSManagedObject删除?

时间:2016-06-13 19:00:19

标签: swift cocoa core-data nsmanagedobject nsundomanager

我正在使用CoreData和NSUndoManager构建基于OSX文档的应用程序。

我有一个处理撤消和重做的全局NSUndoManager,而不是使用每个NSManagedDocument中内置的默认值。这意味着我手动注册了undos和redos,而不是依赖它们在托管对象上下文发生变化时自动注册。

当我从NSManagedObjectContext中删除NSManagedObject时,我想注册一个恢复已删除对象的撤消。我知道这是可能的,因为NSManagedDocument的内置NSUndoManager默认会这样做,但是在删除它之后尝试使用该对象会引发错误。如何在撤消期间恢复实际对象?

func removeAnObject(object: NSManagedObject) {
    self.managedObjectContext?.deleteObject(object)
    self.project?.undoManager?.registerUndoWithTarget(self, handler: { (object) in

        // how to undelete object???

        self.project?.undoManager?.prepareWithInvocationTarget(self).removeAnObject(object)
    })
}

1 个答案:

答案 0 :(得分:1)

弄清楚了。答案很简单:

self.project.undoManager?.insert(object)

棘手的部分是,如果您已将托管对象上下文保存到持久性存储,则“对象”的所有属性都将被清空。但是,如果事先保存这些属性的值,则可以在新插入后重新分配它们。

func removeAnObject(object: NSManagedObject) {

    let property1 = object.property1
    let property2 = object.property2

    self.managedObjectContext?.deleteObject(object)
    self.project?.undoManager?.registerUndoWithTarget(self, handler: { (object) in

        self.managedObjectContext?.insertObject(object)
        object.property1 = property1
        object.property2 = property2

        self.project?.undoManager?.prepareWithInvocationTarget(self).removeAnObject(object)
    })
}