//编辑:真的,没有人对此有任何建议或想法吗?我是否以某种方式错误地问了这个问题?//
我的 iPhone 应用程序有一个 managedObjectContext 和一个中等复杂的数据模型。我现在正在添加撤消功能,但不清楚如何最好地处理嵌套的视图控制器(因为每一层都可能修改数据模型)。
Apple 的文档指出:“考虑一个显示书籍列表的应用程序,并允许您导航到详细视图,进而允许您编辑书籍的各个属性(例如书名、作者和版权日期)。您可以从列表屏幕创建一本新书,在其他两个屏幕之间导航以编辑其属性,然后导航回原始列表。如果列表视图中的撤消操作取消了对作者姓名的更改,这可能看起来很奇怪。将两个屏幕分开,而不是删除整本书。”
那么实现这一点的最佳方法是什么?目前,我正在考虑让每个 viewController 保留自己的 undoManager,只要它在屏幕上,它就会处于活动状态。所以我的理解是,这将需要以下步骤(对于每个 VC):
- 添加属性:
myUndoManager
- 添加
undoManager
方法返回myManagedObjectContext.undoManager;
- In
viewDidAppear
:myManagedObjectContext.undoManager = myUndoManager;
// 如果为 nil,则首先创建 - 在
viewWillDisappear
:myManagedObjectContext.undoManager = nil;
- 关于内存警告:
[self.undoManager removeAllActions ];
- 在dealloc上:
self.myUndoManager = nil;
- 对于每个模型更改:
[self.undoManager setActionName:NSLocalizedString(@“XXX”,@“”)];
- CoreData 将处理实际的撤消/重做发布
另外,我必须保持 firstResponder:
- 在
viewDidAppear
:`[self becomeFirstResponder]' - 添加
canBecomeFirstResponder
方法返回 YES - 在
viewWillDisappear
:[self resignFirstResponder]; - 在子视图辞职时重新启用 firstResponder(例如 textFields)
到目前为止,这似乎有效,即使在加载/卸载周期中也是如此,并且非常独立,但我有几个问题:
- 首先,这是跨多个 VC 实现撤消的最佳实践吗?
- 我是否会因为我的子 VC 在我之前的操作之前没有进行撤消而遇到麻烦?
- 如果是这样,该列表是否包含我需要做的所有事情?
- ManagedObjectContext 会与多个处于活动状态的 UndoManager 混淆吗?
- 在交换 undoManager 之前是否需要调用 ProcessPendingActions?