0

好的,所以我想在我的应用程序中添加撤消某些操作的功能。我打算用我自己的协议或其他东西创建一种方法来做到这一点,但后来我发现了NSUndoManager. 我想使用内置的基础方式,但我似乎无法弄清楚。我需要撤消多个骰子滚动,所以如果我可以将以前的骰子存储为 中的对象NSArray,那可能是最好的。我可以使用NSMutableString,但首选数组。

然后我知道你可以摇晃来撤消,但我宁愿有一个按钮。这些一直给我带来最大的麻烦。我在下面列出了我的尝试。这些都没有奏效。任何帮助,将不胜感激。

在 viewDidLoad 中:

undoManager = [[NSUndoManager alloc] init];

然后在掷骰子的方法中,我尝试了:

   [[undoManager prepareWithInvocationTarget:self] undoButton];
    [[undoManager prepareWithInvocationTarget:self] 
    [[undoManager prepareWithInvocationTarget:self] setString:[NSString stringWithFormat:@"%i", dice1num]];

setStrings:[NSArray arrayWithObjects:[NSString stringWithFormat:@"%i", dice1num]
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num],
    [NSString stringWithFormat:@"%i", dice1num], nil]];
[[undoManager prepareWithInvocationTarget:@selector()];
[undoManager setActionName:@"A roll"];

然后是链接到撤消按钮的 IBAction:

-(IBAction)undoButton{
           [undoManager undo];
}

提前致谢

4

1 回答 1

5

我认为你得到了NSUndoManager错误的功能。撤消管理器就像一堆调用,它们需要用来撤销你刚刚做的事情。因此,原则上您的想法是在您的情况下使用集合对象NSArray来存储多个撤消步骤是正确的。不幸的是,它的工作方式有点不同。

NSUndoManager工作原理

撤消管理器通过在内存中维护一堆撤消步骤来工作。对于您想要撤消的案例掷骰子中的每个步骤,您使用该- (void)registerUndoWithTarget:self selector:@selector(setMyObjectTitle:) object:currentTitle方法注册一个调用对象。你每次掷骰子都要这样做。一次只注册一项操作。

对于撤消,您像以前一样调用撤消方法,然后发生的事情是撤消管理器弹出撤消堆栈的操作并执行它。

您的主要错误是试图重新发明撤消管理器的工作方式。不要注册数组,一次只使用一个骰子。

苹果的撤消架构手册

于 2011-04-03T16:05:49.950 回答