我正在尝试回复用户在我基于非文档的Cocoa应用程序中单击“打开最近”菜单中的项目。我可以通过将其附加到IB中的IBAction来处理File-> Open。但是,当用户点击“最近”列表中的某些内容时,我无法弄清楚如何处理。我需要某种代表吗?
答案 0 :(得分:6)
我使用[NSDocumentController sharedDocumentController]
完成所有提升。文档的here。您的项目不必是基于文档的。
在标题中设置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:
方法应该给出NSURL的NSArray。然后,-noteNewRecentDocumentURL:
将它们添加到标准的“Open Exnts”菜单项(在您第一次设置项目时礼品包装在main.xib文件中)。
当应用程序运行并且您单击该菜单中的某个项目时,操作系统将查找-application:openFiles:
的实现(如果它没有找到它,那么将会有一个NSAlert“yourApp can打开这种类型的文件“)。 fileNames
将成为NSURL的NSArray。
您可能希望以不同方式处理URL的打开,但我已经向我展示了它,因为它突出了一个小问题(我最初这样做)您尝试在调用-application:openFiles:
期间添加最近的项目。在我的项目中,我有一个公共方法来处理从应用程序的各个部分调用的URL的打开,并且默认情况下还将打开的URL添加到“最近”列表中;但我不想重新添加一个已经来自“Open Exnts”菜单的项目,因此签名的addToRecents:
部分的原因。如果你试图这样做会发生崩溃 - 我想它就像一个无限的反馈循环!