Cocoa 以编程方式添加;打开最近的';菜单到上下文弹出菜单

Cocoa 以编程方式添加;打开最近的';菜单到上下文弹出菜单,cocoa,contextmenu,menubar,Cocoa,Contextmenu,Menubar,我有一个带有菜单栏图标和状态菜单的非文档Cocoa应用程序。我在Interface Builder的状态菜单中添加了一个“Open Recent”菜单。填充菜单效果很好: [[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL: [NSURL fileURLWithPath:filename]] 现在,我还想在上下文弹出菜单中添加第二个“打开最近的”菜单。如何以编程方式创建菜单,

我有一个带有菜单栏图标和状态菜单的非文档Cocoa应用程序。我在Interface Builder的状态菜单中添加了一个“Open Recent”菜单。填充菜单效果很好:

[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:
            [NSURL fileURLWithPath:filename]]
现在,我还想在上下文弹出菜单中添加第二个“打开最近的”菜单。如何以编程方式创建菜单,使其像状态菜单中的版本一样自动填充条目


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

作为参考,我找到的关于“最近打开”菜单内部工作的最佳文档如下:

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

到目前为止,我所做的和似乎有效的是:

第一个想法是从主菜单中选择相应的
NSMenu
,并将其附加到其他菜单中,希望引用计数能够实现这一点。如果子菜单已经在另一个
NSMenuItem
中,则会抛出
setSubmenu

因此,我“重新分配”子菜单-当我需要在另一个菜单中显示它时,我将其从主菜单的“最近打开”项中删除,并将其设置为新菜单中的子菜单。稍后,我把它移回去。当然,这是一个丑陋的黑客,但它完成了任务