1

我一直在尝试使用 NSUndoManager 类在我的一个应用程序中设计撤消/重做功能并看到一些设计困难。在我的应用程序中,我只有一种方法

-(IBAction) addLastBall:(Ball *)ball

因此,当用户在 UI 中选择一个按钮时,我将一个球对象添加到我的数组列表中。但是,我没有任何移除球的操作按钮,这是 UI 工作流程的设计,无法更改。因此,为了实现撤消,我在 addLastBall 方法中调用了以下代码

[undoManager registerUndoWithTarget:self selector:@selector(removeBall:) object:ball];

完成此操作后,当用户尝试执行撤消操作时,将使用球对象调用 removeBall 方法。现在一切都很好。但是,我现在不确定如何处理重做部分,当用户尝试重做时,我不确定会调用哪个方法,因为我需要添加用户刚刚使用撤消操作删除的球对象。任何见解都会非常有帮助。

非常感谢。

4

2 回答 2

1

重做只是执行在相应撤消执行时注册的撤消操作。因此,最直接的解决方案是在removeBall:方法中简单地注册一个撤消操作。

- (void)removeBall:(Ball *)ball {
    [undoManager registerUndoWithTarget:self 
                               selector:@selector(addLastBall:)
                                 object:ball];
    ...
}

请注意,有时使用它prepareWithInvocationTarget:来注册撤消操作会更清晰:

[[undoManager prepareWithInvocationTarget:self] addLastBall:ball];

顺便说一句,请确保在方法中保持球的保留计数高于零removeBall:- 撤消管理器不会为您保留球,如果它被释放,那么撤消删除将崩溃。

于 2010-07-24T15:37:19.693 回答
0

没有方法 get 被调用。NSUndoManager 简单地保存撤消操作(重做)的反向操作,如果用户选择重做,这将完成。

都是在 NSUndoManager 中实现的,所以你不用担心。如果您希望在重做时调用您的方法,您应该考虑创建自己的撤消管理器,但我不建议您这样做。它可能会变得非常复杂,此外,NSUndoManager 可以完美地处理所有事情。

于 2010-07-19T17:16:39.230 回答