在NSMenu中响应“最近打开”点击事件

4

我正在尝试响应用户在我的非文档类型Cocoa应用程序中点击“最近打开”菜单中的项目。 我可以通过将其附加到IB中的IBAction来处理File->Open。 但是,我无法弄清楚如何处理用户从最近列表中单击某个选项。 我需要某种委托吗?

1个回答

10

很抱歉有些晚,但如果您仍需要答案:

我使用[NSDocumentController sharedDocumentController]完成所有工作。文档在这里。你的项目不必是基于文档的。

在头文件中设置一个NSDocumentController变量:

NSDocumentController *theDocCont;

然后在你的主要AppDelegate文件中实现以下内容:

-(void)addToRecent:(NSArray*)URLs
{
    if (!theDocCont) {
        theDocCont = [NSDocumentController sharedDocumentController];
    }
    [URLs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [theDocCont noteNewRecentDocumentURL:obj];
    }];
}

-(void)application:(NSApplication *)sender openFiles:(NSArray *)filenames
{
    [self openItems:filenames addToRecents:NO]; //see later
}

现在你可以在NSOpenPanel的完成块中调用[self addItems:[myNSOpenPanel URLs] addToRecents:YES];来将URL添加到“最近使用”菜单。

基本上,-addToRecent:方法应该接收一个NSURL数组。然后通过-noteNewRecentDocumentURL:将它们添加到标准的“打开最近使用”菜单项(在设置项目时主.xib文件自带)。

当应用程序运行并且您点击该菜单中的项目时,操作系统将寻找-application:openFiles:的实现(如果没有找到,将会有一条类似于“yourApp无法打开此类型的文件”的NSAlert)。fileNames将是一个NSURL数组。

您可能希望以不同的方式处理URL的打开,但我展示了我的方式,因为它突出显示了一个小问题:(就像我最初所做的那样),您尝试在调用-application:openFiles:期间添加最近使用的项目。在我的项目中,我有一个公共方法来处理URL的打开,它从应用程序的各个部分以及默认情况下被调用,并将被打开的URL添加到“最近使用”列表中;但我不希望重新添加正在来自“打开最近使用”菜单的项目,这就是签名中addToRecents:的原因。如果您尝试这样做,将会崩溃-我想这就像一个无限反馈循环!


我能够将项目添加到“最近打开”菜单中,但应用程序始终以空列表启动,有没有办法在应用程序启动之间保留列表? - rraallvv
1
脱口而出的建议:将 NSArray 存储在 NSUserPreferences 中。当应用程序启动时,调用 addToRecent: 并传递从首选项文件中获取的数组。 - Todd
谢谢,我会尝试一下。 - rraallvv
使用sharedDocumentController,我的应用程序即使在退出后也会自动记住URL。也就是说,即使应用程序没有运行,您在Dock上右键单击应用程序时仍然可以看到文件。此外,如果您使用storyboard,您可以在对象库中找到带有最近菜单的标准文件菜单。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接