如何在不使用内置撤消管理器的情况下撤消 NSManagedObject 删除?
How can I undo a NSManagedObject deletion without using the built-in undo manager?
我正在使用 CoreData 和 NSUndoManager 构建一个 OSX 基于文档的应用程序。
我有一个处理撤消和重做的全局 NSUndoManager,而不是使用每个 NSManagedDocument 中内置的默认管理器。这意味着我手动注册撤消和重做,而不是依赖它们在托管对象上下文更改时自动注册。
当我从 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)
})
}
明白了。简单答案:
self.project.undoManager?.insert(object)
棘手的部分是,如果您已将托管对象上下文保存到持久存储中,"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)
})
}
我正在使用 CoreData 和 NSUndoManager 构建一个 OSX 基于文档的应用程序。
我有一个处理撤消和重做的全局 NSUndoManager,而不是使用每个 NSManagedDocument 中内置的默认管理器。这意味着我手动注册撤消和重做,而不是依赖它们在托管对象上下文更改时自动注册。
当我从 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)
})
}
明白了。简单答案:
self.project.undoManager?.insert(object)
棘手的部分是,如果您已将托管对象上下文保存到持久存储中,"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)
})
}