NSUndoManager调用不再存在的方法



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

情况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中记录撤消方法(在主视图控制器中)。当我撤消那个remove时,NSUndoManager会在主视图控制器中调用撤消方法,它会重新创建子视图控制器。

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

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

我还能怎么做呢?

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

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

最新更新