gpt4 book ai didi

cocoa - 如何使 NSUndoManager 撤消/重做操作名称正常工作?

转载 作者:行者123 更新时间:2023-12-03 16:07:34 25 4
gpt4 key购买 nike

我正在学习 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"];
}

这是我的期望:

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

事实上,除了最后一个之外,所有这些都按我的预期工作。 “编辑”菜单中的项目显示为“重做关闭标签”,而不是“重做打开标签”。 (当我单击该菜单项时,标签确实会变为“打开”,正如我所期望的那样,但这使得菜单项的名称更加神秘。)

我误解了什么,如何让这些菜单项以我想要的方式显示?

最佳答案

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

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

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

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

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

关于cocoa - 如何使 NSUndoManager 撤消/重做操作名称正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com