回应NSMenu中的Open Recent点击次数

use*_*657 3 cocoa nsmenu

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

Tod*_*odd 6

'这有点晚了,但是在可能的情况下你还需要一个答案:

我用它[NSDocumentController sharedDocumentController]做我所有的提升.文档在这里.您的项目不必是基于文档的.

在标头中设置NSDocumentController变量:

NSDocumentController *theDocCont;
Run Code Online (Sandbox Code Playgroud)

然后在主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
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过[self addItems:[myNSOpenPanel URLs] addToRecents:YES];从NSOpenPanel 的完成块调用来添加到"最近"菜单.

基本上,该-addToRecent:方法应该给予NSURL的NSArray.然后将它们添加到标准的"Open Exnts"菜单项(当您第一次设置项目时,它将在main.xib文件中包装礼物)-noteNewRecentDocumentURL:.

当应用程序运行并且您单击该菜单中的某个项目时,操作系统将查找实现-application:openFiles:(如果它没有找到它,那么就会出现"你的App无法打开此类文件"的NSAlert ).fileNames将成为NSURL的NSArray.

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