2014-01-15 38 views
1

我一直在为我的可可应用程序(OS 10.9)提供撤消功能,并且我已经成功实现了使用NSUndoManager的撤消功能实例。但是,我无法在编辑菜单下取消“撤消”文本!我正在使用setActionName方法,详见Apple的文档。我的相关方法: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]设置“新名称”上调用此方法,选择编辑 - >撤消将此改为“测试撤消!”。但是,“编辑”菜单的第一个条目应该更改为“撤消编辑名称”文本,但不是,它只是保留为“撤消”。正如你所看到的,我已经确认文本应该通过吐出NSLog(),它工作得很好(即它提供“编辑名称”)更改。我在这里错过了什么?我是否需要以某种方式将NSUndoManager链接到NSMenu?如果是这样,这是从文档中丢失!

在此先感谢!

+0

此代码在什么对象?这个方法从哪里调用? –

+0

在这种情况下,'self'是NSWindowController的自定义子类。该方法通过编辑窗口中的NSTextField来调用。 –

+0

WindowController的undoManager如何设置? –

回答

0

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

1

好吧,我没有真正确定问题是什么在这里,但有两个相关事物,你应该知道NSUndoManager:

⑴可以有一个单一的应用程序多undoManagers,实际上通常有是。例如,当用户在textField中编辑文本时,textField通常使用自己的个人撤销管理器来撤消输入和编辑,而不是文档的撤消管理器。这是因为,在用户接受她的输入后,文档撤消堆栈中不会有大量的虚假撤销操作。 (例如:“撤消单一字母”,“撤消输入另一个字母”,“撤消输入第三个字母”),取而代之的只是一个不错的“撤消对该文本字段的更改”。

因此,如果您要设置名称例如textField的undoManager中的最后一个事件,它不会出现在文档的撤消管理器中 - 它们没有以任何方式链接。 ⑵Undos可以嵌套在撤消管理器中的子组中,如果在嵌套组中设置名称,名称不会在事件结束时自动冒泡到顶层(但是我对此并不积极)。我没有看到任何嵌套,但值得一提。在每个事件开始时都有一个隐式撤销组,并在最后关闭,因此如果您创建了另一个组,那么这就是一个嵌套。

+0

感谢您的详细回复。对于我的情况,只有一个UndoManager应该工作,因为我只会记录重大更改而不是“每个字母”。你是正确的,我没有使用嵌套的子组。我还应该提到我没有使用NSDocument风格的应用程序 - 这是否重要? –