Cocoa 响应NSMenu中打开的最近单击

Cocoa 响应NSMenu中打开的最近单击,cocoa,nsmenu,Cocoa,Nsmenu,我正在尝试响应用户在我的非基于文档的Cocoa应用程序中单击“最近打开”菜单中的项目。我可以通过将文件->打开附加到IB中的iAction来处理它。但是,我不知道当用户单击最近列表中的某个内容时如何处理。我需要某种类型的代表吗?'fraid现在有点晚了,但很可能你还需要一个答案: 我使用[NSDocumentController sharedDocumentController]来执行所有提升操作。文件是免费的。您的项目不必基于文档 在标题中设置NSDocumentController变量: N

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

'fraid现在有点晚了,但很可能你还需要一个答案:

我使用
[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
}
现在,您可以通过调用
[self addItems:[myNSOpenPanel url]addToRecents:YES]来添加到最近的菜单中

基本上,应该为
-addToRecent:
方法提供一个NSURL数组。然后通过
-noteNewRecentDocumentURL:
将它们添加到标准的“Open Recents”菜单项中(当您第一次设置项目时,该菜单项包装在main.xib文件中)

当应用程序运行时,您单击该菜单中的某个项目,操作系统将查找
-应用程序:openFiles:
(如果未找到,则会出现一个类似“yourApp无法打开此类型文件”的NSAlert)<代码>文件名
将是NSURL的NSArray


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

我可以将项目添加到“Open Recent”(打开最近的)菜单中,但应用程序总是以空列表开始,有没有办法在应用程序启动之间保留列表?我想不起来:在
nsserPreferences
中存储
NSArray
。当应用程序启动时,调用
addToRecent:
并传递从prefs文件获得的数组。谢谢,我会尝试一下。使用sharedDocumentController,我的应用程序即使退出后也会自动记住URL。即,即使应用程序未运行,在Dock中右键单击应用程序时也可以看到文件。此外,如果使用情节串连板,则可以在对象库中找到带有“最近”菜单的标准文件菜单。