Cocoa 自定义 NSDocument 保存

Posted

技术标签:

【中文标题】Cocoa 自定义 NSDocument 保存【英文标题】:Cocoa custom NSDocument saving 【发布时间】:2013-09-25 11:54:35 【问题描述】:

我有一个应用程序,我使用第三方库来保存和加载数据。通常在使用 NSDocument 时,我已经覆盖了 - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError 方法并返回了正确的数据,但是使用这个库我只能访问一个保存例程(它也可以创建多个文件,否则我会保存到一个临时文件并返回临时文件的数据)。

我还尝试了以下方法:

- (void)saveToURL:(NSURL *)url ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *errorOrNil))completionHandler

   librarySaveFunction(url.path);

哪个有效,但文档标题保持为“我的文件 - 已编辑”,如果我再次尝试保存,我会收到一个错误,指出该文档已被另一个应用程序更新(我可以通过设置我的文件来解决这个问题修改日期,但文件仍然标记为已编辑,感觉很hackish)。

对于覆盖保存程序的更好方法,有人有更好的建议吗?

【问题讨论】:

【参考方案1】:

NSDocument 有一个庞大的层次结构,涉及读取和写入数据。您应该覆盖哪一个在很大程度上取决于您的特定情况的细节以及它们与默认读/写机制的关系。当我看到这个问题时,我的直觉反应是你不想覆盖-save* 方法,你想覆盖-write* 方法(可能是-writeToURL:ofType:forSaveOperation:originalContentsURL:error:),但如果不了解更多信息,真的很难说关于您的应用(以及您正在使用的这个第三方库)的细节。

关于各种覆盖点和适用情况的最终讨论是here。

【讨论】:

以上是关于Cocoa 自定义 NSDocument 保存的主要内容,如果未能解决你的问题,请参考以下文章

保护文档架构中的模型(Cocoa/Swift)

如何在基于 NSDocument 的 Cocoa 应用程序中使用 NSViewController

设置 NSDocument 以保存非本机类型

如何获取 NSDocument 子类来打印自定义视图

在基于文档的 Cocoa 应用程序中避免耦合?

自定义类 Unarchive 在 Cocoa Swift 中为零