【问题标题】:Get NSDocument from NSObject从 NSObject 获取 NSDocument
【发布时间】:2021-01-13 11:16:53
【问题描述】:

我使用的是 macOS,objective-c,而不是 iOS。 我目前正在重写我的应用程序以基于文档。我现在将每个 NSDocument 文件中需要的数据保存为属性,该属性很好用,包括自动保存。

我可以通过 NSViewControllers 访问该数据

self.view.window.document.mydata

我也可以通过

访问数据
[[NSDocumentController sharedDocumentController] currentDocument].mydata

但正如文档对上述方法所说的那样

如果在应用未激活时调用此属性,则该属性的值为 nil。

我的问题是我在文档中有(大量)自定义 NSObject 来处理内容并需要访问该数据。这也发生在后台(使用计时器)。如果应用程序在后台并且没有可用的窗口,那么从 NSObject 访问文档的最佳方式是什么?

我需要在创建时将文档传递给每个对象吗?这感觉不正确。

【问题讨论】:

  • 我认为如果您开发扩展程序,您也会遇到同样的问题,例如快速查看您需要在没有正确文档的情况下访问文档数据的位置。由于您只是在查找数据而不是在完整文档中获得的所有功能,因此您可能需要去除数据的序列化和反序列化,以便您可以在文档内部和文档外部进行操作需要偷看一些东西。
  • 你能举个例子吗?

标签: objective-c nsdocument nsdocumentcontroller


【解决方案1】:

(基于 cmets)这里是一个例子。尽管适用于 iOS。文档本身由存储在多个文件中的大量互连对象组成。在 UIDocument 内部存储文档数据时,我创建一个摘要并将其存储在名为 sum 的单独文件(文档内部)中。

在其他地方我需要提供有关文档的一些信息,但我不需要恢复整个文档或启动所有对象并链接和运行。我只需要从摘要文件中读取。这实际上是第二次迭代,之前我确实恢复了它,但通过在保存文档时创建此摘要来简化它。

也就是说,也许您可​​以使用这样的摘要来存储您在访问NSDocument 之外的文档数据时需要的基本资料?

总之,这就是那段代码。

NSDictionary < NSString *, NSFileWrapper * > * fDic = self.wrapper.fileWrappers;
NSFileWrapper * sumWrapper = [fDic objectForKey:@"sum"];

这与UIDocument 文件加载和保存挂钩中发生的情况非常相似,并且与NSDocument 的情况相似。

无论如何,一旦我有了sumWrapper,我就可以从那里提取我需要的内容,而无需恢复完整的文档。但即使我需要完整的文档,我也可以恢复字典中的所有文件包装器并像在文档中一样使用它们。

我希望这会有所帮助。文档可以包含任何内容。在我的情况下,它相当细化并且分布在很多文件中,这使得访问文档的某些部分变得很容易。如果您将所有对象存储到一个文件中,那么这将变得更加困难,除非您将所有这些功能移到一个单独的支持类中,然后您可以在 NSDocument 的内部和外部使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多