我正在学习Cocoa,在没有太多麻烦的情况下使撤销功能工作起来了。但是setActionName:方法让我感到困惑。这里有一个简单的例子:一个玩具应用程序,其窗口包含一个单独的文本标签和两个按钮。按下On按钮,标签显示“On”。按下Off按钮,标签更改为“Off”。以下是两个相关的方法(我为应用程序编写的唯一代码):
-(IBAction) turnOnLabel:(id)sender
{
[[self undoManager] registerUndoWithTarget:self selector:@selector(turnOffLabel:) object:self];
[[self undoManager] setActionName:@"Turn On Label"];
[theLabel setStringValue:@"On"];
}
-(IBAction) turnOffLabel:(id)sender
{
[[self undoManager] registerUndoWithTarget:self selector:@selector(turnOnLabel:) object:self];
[[self undoManager] setActionName:@"Turn Off Label"];
[theLabel setStringValue:@"Off"];
}
这是我期望的操作:
- 我点击开启按钮
- 标签变为“开启”
- 在编辑菜单中有“撤销开启标签”的选项
- 我点击该菜单项
- 标签变为“关闭”
- 在编辑菜单中有“重做开启标签”的选项
实际上,除了最后一项,所有这些操作都按照我的期望工作。编辑菜单中的项目应该是“重做开启标签”,而不是“重做关闭标签”。(当我点击该菜单项时,标签确实会变为“开启”,但这使得菜单项的名称更加令人费解。)
我是否有什么误解,如何才能让这些菜单项显示成我想要的样子?
setActionName:
的功能,而没有提到redoActionName:
或undoActionName:
的功能。 - Vassilis