cocoa – 以编程方式将“Open Recent”菜单添加到上下文弹出菜单中

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

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

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

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

最佳答案 作为参考,我找到的有关Open Recent菜单内部工作原理的最佳文档是:

http://lapcatsoftware.com/blog/2007/07/10/working-without-a-nib-part-5-open-recent-menu/

不幸的是,它对此没有多大帮助,因为即使你创建这样的菜单,它也会被NSDocumentController忽略.在applicationDidFinishLaunching:call之前,菜单必须存在于主菜单中,否则它将不会被拾取 – 因此,也会忽略重复的菜单.

我到底做了什么,到目前为止似乎有用的是:

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

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

点赞