我有一个复杂的情况,我有一个视图控制器和几个子视图控制器。
情况A:当我更改子视图控制器时,我在NSUndoManager中记录了更改,撤消在子视图控制器中调用undo方法并且工作正常。
-(void)setElementTransform:(NSString *)transform
{
NSUndoManager *undoManager = [Global sharedGlobalInstance].undoMgr;
[undoManager registerUndoWithTarget:self selector:@selector(setElementTransform:) object:self.element.transform];
self.element.transform = transform;
self.view.transform = CGAffineTransformFromString(transform);
}
情况B:这有点复杂 - 当我删除子视图控制器时,我在NSUndoManager中记录撤消方法(在主视图控制器中)。当我撤消删除时,NSUndoManager在主视图控制器中调用undo方法,该方法重新创建子视图控制器。这也很好。
问题在于,如果我执行情境A,然后是情境B,我在撤销堆栈中有两个。我可以撤消情境B,但是情境A引用了不再存在的子视图控制器中的撤消方法(它已被移除并通过在情境B中删除和撤消来重新创建)。
我认为有没有办法更新NSUndoManager以便我可以更改对旧的子视图控制器的引用?
我怎么能应付这个?
答案 0 :(得分:2)
您可以使用不会被丢弃的对象注册所有撤消操作。例如,在顶级视图控制器上,甚至是应用程序委托,或单独的单例。然后,您需要在registerUndoWithTarget的object参数中包含:selector:object:足够的信息,以在相应的子视图控制器或其替换上应用撤消操作。
如果您只需要从撤销堆栈中获取针对死子视图控制器的操作,请在子视图控制器的dealloc(或viewWillDisappear,或viewDidUnload,视情况而定)方法中调用removeAllActionsWithTarget:self。