2016-06-13 74 views
2

我正在构建一个使用CoreData和NSUndoManager的基于OSX文档的应用程序。如何在不使用内置撤销管理器的情况下撤销NSManagedObject删除?

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

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

回答

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) 
    }) 
} 
+0

您是否管理过任何一种用于撤消重做操作的堆栈 –