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

标签 swift cocoa core-data nsmanagedobject nsundomanager

我正在使用 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)

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

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

关于swift - 如何在不使用内置撤消管理器的情况下撤消 NSManagedObject 删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797247/

相关文章:

ios - UITableView 单元格的动态高度问题(Swift)

iOS REST App - 处理 http 请求的最佳实践(与服务器同步数据)

ios - Swift - 在 init() 中使用 UIButton.addTarget 时崩溃

ios - 一旦有完整的行,如何删除 SKSpriteNode? (像俄罗斯方 block )

ios - 由于下载延迟,数组超出索引

xcode - macOS NSExtensionMainStoryboard 无法加载

iOS 使用刷新的身份验证 token 处理请求

ios - 我应该如何存储 Cocoa 应用数据?

ios - NSFetchedResultsController - 仅跟踪对属性子集的更改

objective-c - 核心数据谓词中的异或?