2

我有一个视图控制器,它管理一个始终以编辑模式显示的视图。该视图本质上是一个表格视图,类似于 Apple 的联系人应用程序中的联系人详细信息。我的视图下的模型由一个 2 级对象图表示,该对象图由一个根实体组成 - 称之为它R- 与子实体具有一对多关系C。现在,R是一个大对象(它有 20 多个属性,所有属性都是可编辑的,但不是强制性的)。默认情况下,R有子对象n(是一个可配置的值),但是可以通过我的编辑视图n将子对象添加到/从集合中删除,并且也可以编辑子对象的属性。注意RCC实体包括图像元数据的属性,因此在编辑时可能会选择图像并与模型相关联。

编辑R及其子视图通过主表视图表单以及从我导航(来回)到的“辅助”视图执行,以便根据情况收集所需的信息。

我的问题是,在这种情况下您将如何实施“取消所有编辑”,即我应该如何隔离所有编辑以轻松恢复到编辑之前的状态?NSUndoManager与我的主一起使用NSManagedObjectContext?有单独NSManagedObjectContext的编辑?每个人的权衡是什么?

我不在乎redo。我正在寻找一种想法/解决方案,可以在编辑时使用的内存量与如果应用程序在编辑时中断时保存用户数据的能力之间取得平衡。

谢谢你的所有想法。

4

2 回答 2

1

我建议不要在两个不同的视图中具有相同的编辑功能的设计。每个视图应该代表数据模型的不同实体/类的对象,因此应该有不同的编辑器和撤消管理。

联系人应用程序显示了这是如何完成的。您可以在主表视图中删除整个联系人,在详细视图中删除单个联系人属性。当视图消失时,每个视图中的更改都会提交。这样的设置不仅使撤消管理更容易,而且使用户更容易准确地了解他们正在做的更改。

如果您想坚持您的原始设计,我建议保留主表视图的撤消堆栈,直到主表完全卸载,即不是在详细视图加载时。

于 2011-05-31T17:56:57.233 回答
0

在这里得出的结论是,NSUndoManager要正确使用 Core Data,它必须在子上下文中完成。由于子上下文为您提供“取消所有编辑”功能,因此您也不需要NSUndoManager. 因此,每个可取消的视图控制器都应该在子上下文中完成它的工作,这意味着,例如,控制器 A 将使用文档上下文的子节点,如果它与控制器 B 连接,则将使用 A 上下文的子节点(文档上下文的孩子的孩子)。如果用户按下保存,则会保存上下文,该上下文会自动将更改传播到父级。如果用户按下取消,上下文将被丢弃,从而忽略更改。唯一的复杂性是 iPad 应用程序,其中 A 和 B 可能都可见,并且用户在 A 上按保存(但这可能只是糟糕的设计)。

于 2013-09-04T02:22:36.540 回答