//编辑:真的,没有人对此有任何建议或想法吗?我是否以某种方式错误地问了这个问题?//
我的iPhone应用程序具有一个带有中等复杂数据模型的managedmanagedContext。我现在要添加撤消功能,并且尚不清楚如何最好地处理嵌套的viewController(因为每一层都可能会修改数据模型)。
那么,实现此目标的最佳方法是什么?目前,我正在考虑让每个viewController保留自己的undoManager,只要它在屏幕上就会激活。因此,我的理解是,这将需要以下步骤(对于每个VC):
myUndoManager
undoManager
方法,返回myManagedObjectContext.undoManager;
viewDidAppear
中:myManagedObjectContext.undoManager = myUndoManager;
//如果没有则创建第一个viewWillDisappear
中:myManagedObjectContext.undoManager = nil;
[self.undoManager removeAllActions ];
self.myUndoManager = nil;
[self.undoManager setActionName:NSLocalizedString(@“XXX”,@“”)];
另外,我必须保留firstResponder:
viewDidAppear
中:`[self成为FirstResponder]'canBecomeFirstResponder
方法viewWillDisappear
中:[self resignFirstResponder]; 到目前为止,即使在整个加载/卸载周期中,它似乎都可以正常运行,并且完全是自包含的,但是我有几个问题:
最佳答案
每个 View Controller 可以具有自己的撤消管理器。 Controller 应仅对直接更改的字段负责。一旦退出相应的 View ,就应释放 Controller 并随其一起撤消管理器。
假设您有3个等级。级别1代表整个记录,级别2代表来自级别1的数据子集,级别3代表来自级别2的数据子集。
当您退出第3级时,您基本上已经说过我接受,并且您不需要撤消第2级中的任何数据。如果更改后的数据仅在第2级中显示为只读数据,显示所有。同样,一旦您退出2级,则应释放其撤消管理器。
回到第1层,因为它代表了整个记录,为什么不使用“取消”按钮而不是尝试撤消(或另外,取决于您的第1层 Controller 的功能)呢?
然后,如果要取消所有操作,可以向托管对象上下文发送如下消息:
[myMOC refreshObject:theEditedObject mergeChanges:NO];
这将有效地回滚整个记录。
如果出于某种原因,您决定在处于第2级的同时保留第3级的撤消管理器,并在第2级进行回滚,则只会回退与第2级的撤消管理器有关的数据。级别3的撤消管理器是单独的,并且核心数据不会将撤消管理器视为嵌套的。
受管对象上下文不会因多个撤消管理器而感到困惑,因为它只能通过其
setUndoManager:
方法一次跟踪一个。您可能不需要使用
processPendingChanges
,除非进行更改后以某种方式在事件循环完成之前进行了回滚。除非您的撤消操作仅还原到那时应该由撤消管理器记录的一些数据,否则我不会为此担心。关于iphone - 可以将多个NSUndoManager与一个Core-Data ManagedObjectContext一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4980620/