ios - NSUndoManager 调用不再存在的方法

标签 ios objective-c nsundomanager

我有一个复杂的情况,我有一个 View Controller 和几个 subview Controller 。

情况A:当我更改 subview Controller 时,我将更改记录在NSUndoManager 中,撤消调用 subview Controller 中的撤消方法并正常工作。

-(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: 这有点复杂——当我删除 subview Controller 时,我在NSUndoManager 中记录了撤消方法(在主视图 Controller 中)。当我撤消删除时,NSUndoManager 调用主视图 Controller 中的撤消方法,它会重新创建 subview Controller 。这也很好用。

问题是,如果我先执行情形 A,然后执行情形 B,我的撤消堆栈中就有两个。我可以撤消情况 B,但情况 A 引用了不再存在的 subview Controller 中的撤消方法(它已被删除并通过情况 B 中的删除和撤消重新创建)。

我认为没有任何方法可以更新 NSUndoManager 以便我可以更改对旧 subview Controller 的引用?

我还能如何应对?

最佳答案

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

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

关于ios - NSUndoManager 调用不再存在的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15491018/

相关文章:

iphone - 使用 UITextView 撤消/重做 (iOS/iPHone)

ios - UIAlertController 实用程序类无法调用 UITextField 委托(delegate)或目标,但可以在 UIViewController 中工作

objective-c - UIKeyboardTypeNumberPad 关闭键盘

ios - 为动态创建的 UIButtons 选择/取消选择

objective-c - 如何使用 AVFoundation 将视频转换为动画 gif?

objective-c - 带 block 的 NSUndoManager

cocoa - 如何将 NSUndoManager 与核心数据结合使用并保持用户界面和模型同步?

ios - 将 "Facebook Login"添加到 SimpleAuth 的 Instagram 登录页面

iOS:CSS3 动画中断 div 上的滚动

ios - 发现意外的 Mach-O header 代码 : 0x72613c21 while generating ipa file