如何使NSUndoManager的撤消/重做动作名称正常工作?

Gab*_*oth 7 cocoa undo nsundomanager

我正在学习Cocoa,而且我没有遇到太多麻烦而无法工作.但是setActionName:方法令我感到困惑.这是一个简单的例子:一个玩具应用程序,其窗口包含一个文本标签和两个按钮.按"开"按钮,标签显示"开".按"关闭"按钮,标签将更改为"关闭".以下是两个相关的方法(我为应用程序编写的唯一代码):

-(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"];
}
Run Code Online (Sandbox Code Playgroud)

这就是我的期望:

  • 我单击"开"按钮
  • 标签更改为"开启"
  • 在编辑菜单中是"撤消打开标签"项
  • 我点击该菜单项
  • 标签更改为"关闭"
  • 在编辑菜单中是"重做打开标签"项

事实上,除了最后一个之外,所有这些都是我所期望的."编辑"菜单中的项目显示"重做关闭标签",而不是"重做打开标签".(当我点击该菜单项时,标签确实会转为开启,正如我所料,但这使菜单项的名称更加神秘.

我有什么误解,怎样才能让这些菜单项显示我想要的方式?

Vas*_*lis 3

请记住:当您重做时,您的代码必须为“撤消”菜单项设置一个“actionName”。

当您撤消重做时,“重做”菜单项中的“actionName”会自动设置。

setActionName:更改撤消菜单项。重做菜单项 actionName 是自动执行的。

当您最初 setActionName:![[self undoManager] isUndoing],此操作名称将转到“撤消”菜单项。当您选择撤消([[self undoManager] isUndoing] == YES,您未设置任何操作名称)时,undoManager会自动将此操作名称设置为“重做”菜单项,并将前一个撤消操作名称设置为“撤消”菜单项。当您选择“重做”时,您仍然需要传递一个 actionName 才能转到“撤消”菜单项。

换句话说:只有当您的代码不是 Undoing 时,您才必须设置 actionNames(但必须在最初调用或重做时设置)。