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