0

我有一个复杂的情况,我有一个视图控制器和几个子视图控制器。

情况A:当我更改子视图控制器时,我在NSUndoManager中记录了更改,并且undo调用了子视图控制器中的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 调用主视图控制器中的撤消方法,该方法重新创建子视图控制器。这也很好。

问题是,如果我先执行情况 A,然后执行情况 B,则撤消堆栈中有两个。我可以撤消情况 B,但情况 A 引用了不再存在的子视图控制器中的撤消方法(通过在情况 B 中删除和撤消来删除和重新创建它)。

我认为没有任何方法可以更新 NSUndoManager 以便我可以更改对旧子视图控制器的引用?

我还能如何应对呢?

4

1 回答 1

2

您可以使用不会被丢弃的对象注册所有撤消操作。例如在顶级视图控制器,甚至是应用程序委托,或单独的单例。然后,您需要在 registerUndoWithTarget:selector:object: 的对象参数中包含足够的信息,以便在适当的子视图控制器或其替换上应用撤消操作。

如果您只需要从撤消堆栈中获取针对死子视图控制器的操作,请在子视图控制器的 dealloc(或 viewWillDisappear,或 viewDidUnload,视情况而定)方法中调用 removeAllActionsWithTarget:self。

于 2013-03-19T03:48:35.423 回答