我有一个View Controller来管理一个始终以编辑模式显示的视图。该视图本质上是一个类似于Apple联系人应用程序中联系人详细信息的表格视图。我视图下面的模型由一个由根实体组成的2级对象图表示 - 称之为R
- 与子实体C
具有多对多关系。现在,R
是一个大对象(它有20多个属性,所有属性都可编辑但非强制性)。默认情况下,R
有n
个孩子(n
是可配置的值),但可以通过我的编辑视图在R
的集合中添加和删除子对象和C
的属性也可以编辑。请注意,C
个实体包含图像元数据的属性,因此在编辑时可能会拾取图像并与模型相关联。
R
及其子项的编辑是通过主表格视图以及我导航(来回)的“辅助”视图执行的,以便收集所需的信息,具体取决于案件。
我的问题是,在这种情况下你将如何实现“取消所有编辑”,即我应该如何隔离所有编辑以轻松恢复到编辑前的状态?在我的主NSUndoManager
上使用NSManagedObjectContext
?有一个单独的NSManagedObjectContext
进行编辑?每个人的权衡取舍是什么?
我不关心redo
。我正在寻找一个想法/解决方案,可以在编辑时使用的内存量与在编辑时中断应用程序时保存用户数据的能力之间取得平衡。
感谢您的所有想法。
答案 0 :(得分:1)
我建议不要在两个不同的视图中使用具有相同编辑功能的设计。每个视图应表示数据模型的不同实体/类的对象,因此应具有不同的编辑器和撤消管理。
联系人应用程序显示了如何完成此操作。您可以在主表格视图中删除整个联系人,并在详细信息视图中删除单个联系人属性。视图消失时,将提交每个视图中的更改。这样的设置不仅使撤消管理变得更容易,而且使用户更容易理解他们正在做出的改变。
如果你想坚持原始设计,我建议保留主表视图的撤销堆栈,直到主机完全卸载,即不加载详细视图时。
答案 1 :(得分:0)
我总结here,NSUndoManager
要使核心数据正常运行,必须在子环境中完成。由于子上下文为您提供“取消所有编辑”功能,因此您不需要NSUndoManager
。因此,每个可取消的View Controller都应该在子上下文中完成它的工作。这意味着,例如,控制器A将使用文档上下文的子项,如果它转移到控制器B,那将使用A的上下文的子项(文件背景的孩子的孩子)。如果用户按下“保存”,则会保存上下文,该上下文会自动将更改传播到父级。如果用户按下取消,则丢弃上下文,从而忽略更改。唯一的复杂功能是使用iPad应用程序,其中A和B可能都可见,用户按下A上的保存(但这可能只是糟糕的设计)。