2

我有一个视图控制器管理视图总是以编辑模式显示。该视图基本上是一个表格视图,类似于Apple联系人应用程序中的联系人详细信息。我的视图下方的模型由包含根实体的2级对象图表示 - 称为R - 与子实体C具有多对多关系。现在,R是一个大对象(它有20多个属性,所有可编辑但非强制性的)。默认情况下,Rn子项(n是一个可配置的值),但子对象可以通过我的编辑视图添加到/从R的集合中删除,也可以编辑C的属性。请注意,C实体包含图像元数据的属性,因此可能会在编辑时挑选图像并将其与模型关联。取消编辑:NSUndoManager或单独NSManagedObjectContext进行编辑?

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

我的问题是,如何在这种情况下实施“取消所有修改”,即如何隔离我所有的编辑以轻松恢复到编辑之前的状态?使用NSUndoManager与我的主要NSManagedObjectContext?有一个单独的NSManagedObjectContext进行编辑?每个方面的折衷是什么?

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

谢谢你的所有想法。

回答

1

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

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

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

+0

谢谢你的建议。在联系人应用程序中,可以直接在主桌面视图中添加地址(在编辑时)。我想一个地址被建模为与联系本身不同的实体。我有一个非常相似的情况。你会说NSUndoManager是取消多个实体编辑的最佳工具吗?或第二个上下文隔离编辑?我选择哪个选项有什么关系? – octy 2011-05-31 20:16:59

0

我得出的结论here对于NSUndoManager与核心数据正常工作,必须在孩子方面做了。由于子环境会为您提供“取消所有修改”功能,因此您不需要NSUndoManager。因此,每个可取消的视图控制器应该在子上下文中执行它的工作。这意味着,例如,控制器A将使用文档上下文的子项,并且如果它继续到控制器B,则将使用A的上下文的子项文件上下文的孩子的孩子)。如果用户按下保存,上下文将被保存,并自动将更改传播给父级。如果用户按下取消,上下文将被丢弃,从而忽略更改。唯一的麻烦是iPad应用程序中的A和B可能都可见,并且用户按下了Save on A(但这可能只是不好的设计)。