以编程方式将“打开最近”菜单添加到上下文弹出菜单

时间:2011-08-24 07:32:55

标签: cocoa contextmenu menubar

我有一个非文档Cocoa应用程序,带有菜单栏图标和状态菜单。我已经添加了一个" Open Recent"菜单到Interface Builder中的状态菜单。填充菜单工作得很好:

[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:
            [NSURL fileURLWithPath:filename]]

现在我还要添加第二个"打开最近的"菜单到上下文弹出菜单。如何以编程方式创建菜单,以便自动填充条目,就像状态菜单中的版本一样?

我尝试在状态菜单中创建一个副本,但它没有填充。我假设NSDocumentController不知道菜单(坦率地说,我不知道它如何知道状态菜单中的那个)。

1 个答案:

答案 0 :(得分:2)

作为参考,我找到的 Open Recent 菜单内部工作原理的最佳文档如下: http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5-open-recent-menu/

不幸的是,它对此没有多大帮助,因为即使您创建这样的菜单,NSDocumentController也会忽略它。菜单必须在applicationDidFinishLaunching:调用之前存在于主菜单中,否则将不会被选中 - 因此,也会忽略重复的菜单。

我最终做了什么,到目前为止似乎有效的是:

第一个想法是从主菜单中选择相应的NSMenu并将其附加到其他菜单中,希望引用计数能够使其工作。如果子菜单已经在另一个setSubmenu中,则没有这样的运气NSMenuItem

所以我重新调整了子菜单 - 当我需要在另一个菜单中显示它时,我将其从主菜单的打开最近项中删除,并将其设置为新菜单中的子菜单。后来,我把它搬回来了。当然,这是一个丑陋的黑客,但它完成了工作。