NSUndoManager setActionName:不会更改菜单文本

时间:2014-01-15 04:47:26

标签: objective-c cocoa nsstring nsmenu nsundomanager

我一直在为我的cocoa应用程序(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?如果是这样,文档中就会遗漏这些内容!

提前致谢!

2 个答案:

答案 0 :(得分:1)

好的,我真的不确定这里的问题是什么,但是你应该知道两件关于NSUndoManager的相关事情:

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

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

⑵Undos可以嵌套在undoManager中的子组中,如果你在嵌套组中设置名称,名称在事件结束时不会自动冒泡到顶层,可能就是这种情况(但是我对此并不积极。我没有看到任何筑巢,但值得一提。有一个隐含的撤销组在每个事件开始时开始并在结束时关闭,所以如果你创建了另一个组,那么这就是一个嵌套。

答案 1 :(得分:1)

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