gpt4 book ai didi

objective-c - 自动保存并非源自用户的 NSDocument 模型更改

转载 作者:行者123 更新时间:2023-12-03 16:41:09 25 4
gpt4 key购买 nike

我有一个基于 NSDocument 的 OS X 应用程序,它不是使用空白页面创建新文档,而是向用户显示一个面板以从中选择模板,就像 Apple 的 Pages.app 所做的那样。

我通过在用户启动新文档时手动创建一个新的 NSDocument 实例并立即在其上设置一个属性来反射(reflect)用户为其选择的模板来实现此目的:

MyNSDocumentSubclass *newDoc = [sharedDocumentController makeUntitledDocumentOfType:fileType error:&err];
[newDoc setTemplate:templateChosenByUser]; // autosave doesn't care about this line
[sharedDocumentController addDocument:newDoc];
[newDoc makeWindowControllers];
[newDoc showWindows];

这一切正常,直到用户决定重新启动计算机或关闭应用程序而不保存:当 App Kit 的自动保存功能尝试在下次启动时恢复应用程序的先前状态时,它无法为用户模板属性执行此操作因为它从未注意到 MyNSDocumentSubclass 的模型状态已更改,并且一开始就没有自动保存整个文档。相反,可能出于性能优化的原因,它只是创建一个新的 MyNSDocumentSubclass 实例,并且用户的模板选择会丢失。

为了解决这个问题,我添加了

[newDoc updateChangeCount:NSChangeDone];

反射(reflect)用户选择模板所引入的模型机会。现在,自动保存功能可以正确启动,并在计算机或应用程序关闭之前保存文档。唯一的缺点(也是我在这里寻求帮助的问题)是,这是错误的方法: NSChangeDone 旨在反射(reflect)用户发起的文档模型的机会。因此,它会导致“已编辑”已显示在新文档的窗口中,并在关闭窗口时向用户显示保存面板。不过,用户的模板选择并不是真正的更改,应算作“编辑”,因为它与新文档的创建紧密相关。幸运的是,OS X 发行说明准确地讨论了这个问题并提供了解决方案:

Some applications use -updateChangeCount: to cause NSDocument to autosave changes that don't originate directly from the user. For example, when importing a non-native document type, some applications create a new document with the imported contents and call -updateChangeCount: to ensure that the document gets autosaved with those contents. Many applications use NSChangeDone for this purpose. However, since the user did not explicitly cause this change, it is undesirable to turn this document into a draft. Applications should be careful to use the correct NSDocumentChangeType—in this case, NSChangeReadOtherContents—to prevent the conversion into a draft. Using NSChangeDiscardable will also prevent the creation of a draft.

不幸的是,[newDoc updateChangeCount:NSChangeReadOtherContents] 根本不起作用。它确实会抑制窗口标题中的“已编辑”,但同时它会阻止自动保存在终止应用程序时完成其工作:文档不会自动保存,并在下次启动时丢失其模板属性的值。

那么,我能做什么呢? 我希望新创建的 NSDocument 子类能够自动保存用户的模板选择。同时,它不应该向用户显示为已经被编辑,而实际上他们刚刚创建了它。

我唯一能想到的就是尝试使用 NSWindowRestoration 协议(protocol)来保存模板属性,但这感觉显然是错误的。此外,窗口恢复在文档重新打开过程中启动得太晚了。我的另一个想法是为用户可以选择的每个模板创建几个不同的 NSDocument 子类(由具有单个 UTI 的不同文件类型反射(reflect)),而不是使用我的 NSDocument 上的属性子类 - 但这仍然感觉不对。否则,我就迷路了。感谢您的帮助。

最佳答案

我认为不会有一种干净的方法来完成您想要的操作,因为从根本上讲,您试图存储用户在自动保存文件中设置的内容,并且不会让 NSDocument 注意到该文件是“脏的”,当根据苹果的定义,它实际上是肮脏的。

但是,我认为如果你愿意变得有点肮脏,你就可以完成你想要的事情。一个想法就是简单地做类似的事情:

[newDoc updateChangeCount:NSChangeDone];
[newDoc autosaveWithImplicitCancellability:NO completionHandler:^(NSError *errorOrNil){
[newDoc updateChangeCount:NSChangeCleared];
}];

我知道,我知道,这不干净。

关于objective-c - 自动保存并非源自用户的 NSDocument 模型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21060037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com