【问题标题】:Add to the "Open Recent" menu an item that doesn't point to a file将不指向文件的项目添加到“打开最近”菜单
【发布时间】:2010-07-13 11:08:30
【问题描述】:

有没有办法将一个不指向文件系统中存在的文件的项目添加到“打开最近”菜单?

在不基于 NSDocument 的应用程序中,我可以使用以下代码将项目添加到“打开最近”子菜单:

[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL URLWithString:stringToFilePath]];

它作为documented 工作,只要 URL 指向文件系统中存在的文件。

如果 url 不指向系统上的文件,例如 web url 或自定义 url 方案,则不会发生任何事情。

例如,这段代码没有任何作用,并且在执行过程中不会产生日志,即使我的应用程序处理了 URL 中使用的方案:

[[NSDocumentController sharedDocumentController] noteNewRecentDocumentURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];

更新:有人(很久以前)找到了一种方法来调整这个菜单,让它显示文件是否存在:http://lists.apple.com/archives/cocoa-dev/2007/Apr/msg00651.html

我成功地继承了 NSDocumentController 的子类,但我对方法的覆盖 - (NSArray *)recentDocumentURLs 从未被调用。

正如文档所说,这并不令人惊讶:

这个方法不好 覆盖,因为内部 NSDocumentController 一般不会 使用它。

但是文档没有说明要使用什么,海报也没有提供更多细节。有什么想法吗?


如果没有解决方案,解决方法是从头开始重写整个菜单。 如果可能的话,我宁愿避免这种情况,因为我免费获得的所有东西(比如当你有两个同名的项目时,它也会显示父目录以帮助区分它们)。

【问题讨论】:

    标签: cocoa macos menu nsdocument recent-documents


    【解决方案1】:

    看起来您可能必须创建自己的菜单并维护自己的单独列表。此菜单自动排除不存在的文件。

    我相信对于不存在的可移动媒体上的文件也是如此(即,如果媒体恢复,我相信如果该文件没有被最近的项目推开,那么该文件将再次出现在列表中)。

    【讨论】:

    • 我联系了在苹果邮件列表上发帖的人。尽管他继承了 NSDocumentController 的子类,但由于从不调用 recentDocumentURLs,他最终还是手动构建了菜单。
    • 是的,我还建立了一个单独的列表,并为用户显示了一个类似的菜单。在我的情况下,该列表具有混合位置类型(本地、url、云)。对于本地文件,我必须推出自己的“最近打开”,但我没有设法让应用程序将文件与其位置相关联 - 保存时,会显示“另存为”对话框
    • 好的,同时我已经覆盖了 saveDocument 并调用 writeSafelyToUrl。但我认为现在该应用不再是沙盒应用,这意味着它不会进入商店?
    • @RaduSimionescu 这应该作为一个单独的问题发布,而不是作为 cmets。
    • 好的,我想我解决了。以下是发生的情况:如果您在最近列表中管理自己的本地文件 URL,则无法访问您构建的 NSUrls。但是,如果您从 NSDocumentController 最近的文件列表中获取它们,它们是可以访问的。系统可能仅对该列表中的 NSUrl 对象进行一些访问异常,即使您自己的 NSUrl 指向相同的文件
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 2012-05-14
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多