【问题标题】:NSUndoManager setActionName: doesn't change menu textNSUndoManager setActionName:不改变菜单文本
【发布时间】:2014-01-15 04:47:25
【问题描述】:

我一直在为我的可可应用程序(OS 10.9)实现撤消功能,并且我已经使用 NSUndoManager 成功实现了撤消功能的实例。但是,我无法在编辑菜单下更改“撤消”文本!我正在使用 Apple 文档中详述的 setActionName 方法。我的相关方法:

- (void)FinishEditingName {

[[self UndoManager] registerUndoWithTarget:[self TestObject] selector:@selector(setName:) object:[NSString stringWithFormat:@"Testing Undo!"]];
[[self UndoManager] setActionName:@"Edit Name"];

[[self TestObject] setName:[NSString stringWithFormat:@"New Name"]];

NSLog([NSString stringWithFormat:@"%@",[[self UndoManager] undoActionName]]);

}

再次,撤消工作完美,即 [[self TestObject] Name] 在调用此方法时设置为“新名称”,选择编辑 -> 撤消将其更改为“测试撤消!”。但是,编辑菜单的第一个条目应该更改为文本“撤消编辑名称”,但它没有,它只是保持为“撤消”。如您所见,我已经确认文本 应该 通过使用 NSLog() 将其吐出来进行更改,它工作得很好(即它给出了“编辑名称”)。这里缺少什么?我需要以某种方式将 NSUndoManager 链接到 NSMenu 吗?如果是这样,则文档中缺少此内容!

提前致谢!

【问题讨论】:

  • 这段代码在什么对象中?这个方法是从哪里调用的?
  • 在这种情况下,self 是 NSWindowController 的自定义子类。该方法通过在窗口中编辑一个 NSTextField 来调用。
  • WindowController的undoManager是如何设置的?
  • [self setUndoManager:[[NSUndoManager alloc] init]]; 别告诉我我错过了初始化程序...

标签: objective-c cocoa nsstring nsmenu nsundomanager


【解决方案1】:

问题是我没有使用 NSDocument,在这种情况下,菜单和 NSUndoManager 之间的链接不会自动设置 - 您需要自己处理。这似乎在 NSDocument 文档中,但不在 NSUndoManager 文档中,在 IMO 中,应该注意。感谢您的帮助!

【讨论】:

    【解决方案2】:

    好的,我实际上并不确定问题出在哪里,但是您应该了解有关 NSUndoManager 的两件事:

    ⑴ 单个应用中可以有多个undoManager,实际上通常是有的。例如,当用户在 textField 中编辑文本时,textField 通常使用它自己的个人 undoManager 来撤消键入和编辑,而不是文档的 undoManager。这样一来,在用户接受她的输入后,文档撤消堆栈上就不会出现一堆虚假的撤消操作。 (例如:“撤消键入一个字母”“撤消键入另一个字母”“撤消键入第三个字母”),而只是一个不错的“撤消对该文本字段的更改”。

    因此,如果您在 textField 的 undoManager 中设置最终事件的名称,它不会显示在文档的 undoManager 中——它们不会以任何方式链接。

    ⑵撤消可以嵌套在undoManager中的子组中,如果您将名称设置在嵌套组中,则名称可能不会在事件结束时自动冒泡到顶层(但我'我对此并不积极)。我在这里看不到任何嵌套,但值得一提。在每个事件开始时都有一个隐式撤消组开始并在结束时关闭,因此如果您创建了另一个组,那就是一个嵌套。

    【讨论】:

    • 感谢您的详细回复。就我而言,只有一个 UndoManager 应该可以工作,因为我只会记录重大更改而不是“每个字母”。你说得对,我没有使用嵌套子组。我还应该提到我没有使用 NSDocument 风格的应用程序 - 这有关系吗?
    猜你喜欢
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多