4

我正在尝试响应用户在我的非基于文档的 Cocoa 应用程序中单击“打开最近”菜单中的项目。我可以通过将文件附加到 IB 中的 IBAction 来处理文件->打开。但是,当用户从“最近”列表中单击某些内容时,我无法弄清楚如何处理。我需要某种代表吗?

4

1 回答 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];的完成块来添加到“最近”菜单。

基本上,该-addToRecent:方法应该被赋予一个 NSURLs 的 NSArray。然后,它们会被-noteNewRecentDocumentURL:.

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

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

于 2013-01-09T13:06:28.877 回答