我一直在为我的可可应用程序(OS 10.9)实现撤消功能,并且我已经使用NSUndoManager成功地实现了撤消功能的实例。但是,我无法在编辑菜单下更改"撤消"文本!我使用的是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]
在调用此方法时设置为"新名称",选择Edit->undo将其更改为"Testing undo!"。但是,"编辑"菜单的第一个条目应该更改为文本"撤消编辑名称",但它没有,只是保持为"撤消"。正如您所看到的,我已经确认文本应该通过使用NSLog()进行吐出来更改,这很好(即它给出了"编辑名称")。我在这里缺了什么?我是否需要以某种方式将NSUndoManager链接到NSMenu?如果是这样的话,文档中就没有这个了!
提前感谢!
问题是我没有使用NSDocument,在这种情况下,菜单和NSUndoManager之间的链接不会自动设置,您需要自己处理。这似乎在NSDocument文件中,但在NSUndoManager文件中没有,其中应注意IMO。谢谢你的帮助!
好的,我实际上不确定这里的问题是什么,但关于NSUndoManager,你应该知道两件相关的事情:
⑴在一个应用程序中可以有多个undoManager,事实上通常都有。例如,当用户在textField中编辑文本时,textField通常使用自己的个人undoManager来撤消键入和编辑,而不是文档的undoManager。这样,在用户接受她的输入后,文档撤消堆栈上就不会有一堆虚假的撤消操作。(例如:"撤消键入一个字母"撤消键入另一个字母"撤消键入第三个字母"),相反,只有一个很好的"撤消对该文本字段的更改">
因此,如果你在textField的undoManager中设置最后一个事件的名称,它不会显示在文档的undoManager中——它们不会以任何方式链接。
⑵Undos可以嵌套在undoManager中的子组中,如果您在嵌套组中设置名称,则可能会在事件结束时名称不会自动冒泡到最高级别(但我对此并不肯定)。我在这里没有看到任何嵌套,但值得一提的是。有一个隐含的撤消组从每个事件的开始到结束,所以如果你创建了另一个组,那就是一个嵌套。