我正在尝试响应用户在我的非文档类型Cocoa应用程序中点击“最近打开”菜单中的项目。 我可以通过将其附加到IB中的IBAction来处理File->Open。 但是,我无法弄清楚如何处理用户从最近列表中单击某个选项。 我需要某种委托吗?
很抱歉有些晚,但如果您仍需要答案:
我使用[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:
的原因。如果您尝试这样做,将会崩溃-我想这就像一个无限反馈循环!
NSArray
存储在NSUserPreferences
中。当应用程序启动时,调用addToRecent:
并传递从首选项文件中获取的数组。 - Todd