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

Mar*_*ark 5 cocoa contextmenu menubar

我有一个带有菜单栏图标和状态菜单的非文档 Cocoa 应用程序。我在 Interface Builder 的状态菜单中添加了一个“打开最近的”菜单。填充菜单工作得很好:

[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:
            [NSURL fileURLWithPath:filename]]
Run Code Online (Sandbox Code Playgroud)

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

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

Vác*_*vík 2

作为参考,我发现的有关“打开最近的”菜单内部工作原理的最佳文档是:\n http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5 -打开最近菜单/

\n\n

不幸的是,\xe2\x80\x99 对此没有多大帮助,因为即使你创建这样的菜单,它也会被NSDocumentController. 调用前该菜单必须存在于主菜单中applicationDidFinishLaunching:,否则\xe2\x80\x99 不会被拾取\xe2\x80\x94,因此重复的菜单也会被忽略。

\n\n

我最终所做的以及到目前为止似乎有效的事情是:

\n\n

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

\n\n

所以我 \xe2\x80\x9creparent\xe2\x80\x9d 子菜单而不是 \xe2\x80\x94 当我需要在另一个菜单中显示它时,我从主菜单中删除它\xe2\x80\x99s 打开最近项目并将其设置为新菜单中的子菜单。后来我把它移回来。当然,它\xe2\x80\x99是一个丑陋的黑客,但它完成了工作。

\n