如何在 NSDocument 加载之前拦截 openDocument 的结果?

Posted

技术标签:

【中文标题】如何在 NSDocument 加载之前拦截 openDocument 的结果?【英文标题】:How can I intercept the result of openDocument before NSDocument loads? 【发布时间】:2013-08-14 08:36:31 【问题描述】:

我正在编写一个程序来加载和处理 XML 数据。如果 XML 文件包含单个 XML“字典”,那么它需要打开一个 NSDocument 窗口(到目前为止,一切都很好 - 我可以做到这一点!),但如果 XML 文件包含一个字典数组,那么它应该打开一个列表窗口,从中可以将各个字典打开到 NSDocument 中。

因为 File->Open 在文档窗口打开之前向 First Responder->openDocument 发送了一个动作,所以我认为 openDocument 函数不是 NSDocument 的一部分。因此,我希望能够在 open 函数移交给 NSDocument 之前拦截它 - 只是为了检查该文档是否是我想要作为文档而不是作为我的整洁列表视图打开的文档。

另一方面,如果 openDocument 是一个 NSDocument 函数,我怎样才能安静地关闭 NSDocument 窗口并将 XML 列表交给我的列表窗口,而不会在这种情况下引发错误?当然,我不想完全抑制错误 - 因为可能有正当理由引发错误(不可读的文件、错误的语法等)

我意识到我正在尝试做的事情有点不正统 - 但希望它是可能的。有什么想法吗?

【问题讨论】:

【参考方案1】:

openDocument:是NSDocumentController的一个实例方法。

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocumentController_Class/Reference/Reference.html#//apple_ref/doc/uid/20000030-openDocument_

您可以使用自己的子类 NSDocumentController。这将允许您拦截 openDocument:。

如果您想在创建文档之前检查文件,则需要使用 NSOpenPanel 来打开文件对话框。然后在要创建文档时调用 openDocumentWithContentsOfURL:display:completionHandler:。如果您不想创建文档,则可以触发任何您想做的事情。

【讨论】:

【参考方案2】:

只需向您的应用委托添加一个处理 openDocument 的函数

func openDocument(sender: AnyObject) 
    print("openDocument got called")

运行应用程序并按 cmd+o

【讨论】:

以上是关于如何在 NSDocument 加载之前拦截 openDocument 的结果?的主要内容,如果未能解决你的问题,请参考以下文章

进度 - NSDocument 应用程序上的加载窗口

如何同时保存 NSDocument?

将文件写入 NSDocument 目录在 iPhone 中显示 UIProgressView?

NSDocument 应用程序和文件扩展名

Cocoa 自定义 NSDocument 保存

使用 NSDocument 时如何隐藏保存面板