【问题标题】:Respond to Open Recent clicks in NSMenu响应在 NSMenu 中打开最近的点击
【发布时间】:2012-08-20 03:17:33
【问题描述】:

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

【问题讨论】:

    标签: cocoa nsmenu


    【解决方案1】:

    '恐怕这有点晚了,但你仍然需要一个答案:

    我使用[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: 添加到标准的“打开最近”菜单项(当您第一次设置项目时,它被包装在 main.xib 文件中)。

    当应用程序正在运行并且您单击该菜单中的一个项目时,操作系统将寻找-application:openFiles: 的实现(如果它没有找到它,将会有一个 NSAlert 类似于“yourApp can't打开这种类型的文件”)。 fileNames 将是 NSURL 的 NSArray。

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

    【讨论】:

    • 我能够将项目添加到“打开最近”菜单,但应用程序总是以空列表开头,有没有办法在应用程序启动之间保留列表?
    • 突然想到:将NSArray 存储在NSUserPreferences 中。当应用程序启动时,调用addToRecent: 并传递您从 prefs 文件中获得的数组。
    • 谢谢,我试试看。
    • 使用 sharedDocumentController,我的应用即使在退出后也会自动记住 url。 IE。右键单击 Dock 中的应用程序时,即使它没有运行,您也可以看到文件。此外,如果您使用故事板,您可以在对象库中找到标准文件菜单和最近菜单。
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2012-08-04
    相关资源
    最近更新 更多