【问题标题】:How do I restore a NSUndoManager's contents in a CoreData NSManagedObjectContext?如何在 CoreData NSManagedObjectContext 中恢复 NSUndoManager 的内容?
【发布时间】:2010-12-31 06:40:26
【问题描述】:

我想在 iPhone 应用程序中的 CoreData (NSManagedObject) 对象上使用 NSUndoManager,这样如果应用程序过早退出(例如,由于来电),我可以保存(并稍后恢复)NSUndoManager 的状态)。 IE。与自动丢弃或保存在 NSUndoManager 中累积的更改相反,我想恢复它们,以便用户在重新启动应用程序时可以选择显式丢弃或保存它们。

有人有这方面的经验吗?当应用程序中断时,任何人都可以推荐这种(或替代)方法来管理 NSManagedObjectContext 中的未决更改吗?

【问题讨论】:

    标签: iphone core-data undo redo


    【解决方案1】:

    请注意,通过使用单独的 NSManagedObjectContexts 存在一种可能的解决方法,这样一些在关闭时保存,而另一些则回滚其更改。它并不完美,但我找到了一个合适的解决方案来解决我的问题。

    【讨论】:

      【解决方案2】:

      NSUndoManager 实际上并没有存储状态,它存储了一堆将恢复状态的操作。例如,如果您有一个对象 XXX,并且它的属性名称是一个字符串,并且您将该名称从“Steve”更改为“Joe”,则 NSUndoManager 存储的是目标、选择器和对象。目标是 XXX 的实例,选择器是 @selector(setName:),对象是 @"Steve"

      通过存储该信息,如果撤消堆栈被弹出,它将在对象 XXX 的实例上调用-setName:,其值为@“Steve”,从而恢复其状态。围绕 KVO 等做了一些额外的工作,但这是基础。

      起初我推测你可以写出NSManagedObjectID、选择器(使用NSStringFromSelector)和对象到磁盘并通过调用-registerUndoWithTarget: selector: object: 来恢复它们。但是,在进一步查看文档后,无法访问堆栈以对其进行迭代。

      【讨论】:

      • 很遗憾,我同意。似乎没有一种方便而简单的方法来做到这一点。当然有变通办法,但没有什么优雅的想法。
      猜你喜欢
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 2020-05-04
      相关资源
      最近更新 更多