我有一个基于NSDocument的OS应用程序,它不是用空白页创建新文档,而是向用户显示一个面板,让用户从中选择模板,比如苹果的Pages.app。
我是通过在用户启动新文档时手动创建一个新的NSDocument实例,并立即在其上设置一个属性来反映用户为其选择了哪个模板来做到这一点的:
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的autosave功能在下一次启动时尝试恢复我的应用程序的以前状态时,它无法恢复用户模板属性,因为它从来没有注意到MyNSDocumentSubclass的模型状态已经改变,并且从一开始就没有自动保存整个文档。相反,可能出于性能优化的原因,它只是创建了一个新的MyNSDocumentSubclass实例,用户的模板选择就丢失了。
为了解决这个问题,我补充说
[newDoc updateChangeCount:NSChangeDone];以反映用户选择模板所引入的模型机会。现在,自动保存程序正确启动,并在计算机或应用程序关闭之前保存文档。唯一的缺点(以及我在这里寻求帮助的问题)是,这是错误的做法:NSChangeDone是为了反映一个由用户发起的文档模型的机会。因此,它将导致一个已经在新文档窗口中显示的“编辑”,并在关闭窗口时向用户显示一个保存面板。然而,用户的模板选择实际上并不是一个应该算作“编辑”的更改,因为它与新文档的创建紧密耦合在一起。幸运的是,OS发行说明正是讨论了这个问题,并提供了一个解决方案:
有些应用程序使用
-updateChangeCount:使NSDocument自动保存不直接来自用户的更改。例如,当导入非本机文档类型时,一些应用程序使用导入的内容和调用-updateChangeCount:创建一个新文档,以确保文档与这些内容一起自动保存。许多应用程序都为此目的使用NSChangeDone。但是,由于用户没有显式地导致此更改,因此将此文档转换为草案是不可取的。应用程序应该小心使用正确的NSDocumentChangeType-in--在这种情况下,NSChangeReadOtherContents-to会阻止转换为草案。使用NSChangeDiscardable也会阻止草案的创建。
不幸的是,[newDoc updateChangeCount:NSChangeReadOtherContents]根本不工作。它确实抑制了窗口标题中的“编辑”,但同时也阻止了autosave在终止应用程序时完成其工作:文档没有自动加载,并在下一次启动时放松其模板属性的值。
那么,我能做什么呢?我希望我的新创建的NSDocument 子类能够自动保存用户的模板选择。同时,当用户刚刚创建它时,它不应该显示已经被编辑过的内容。
我唯一能想到的就是尝试通过使用NSWindowRestoration协议来保存模板属性,但这显然是错误的。此外,窗口恢复在文档重新打开过程中启动得太晚了。我的另一个想法是为用户可以选择的每个模板创建几个不同的NSDocument子类(用一个UTI来反映不同的fileTypes ),而不是在我的NSDocument子类上使用一个属性--但是这感觉是错误的。否则,我就迷路了。谢谢你的帮助。
发布于 2014-01-11 09:12:46
我不认为会有一种干净的方式来做你想做的事情,因为从根本上说,你是在把用户设置的东西存储在自动保存文件中,而不是让NSDocument注意到文件是“脏的”,而根据苹果的定义,文件实际上是脏的。
但是,我认为你可以完成你想要的,如果你愿意弄得有点脏。一个简单的想法是做如下的事情:
[newDoc updateChangeCount:NSChangeDone];
[newDoc autosaveWithImplicitCancellability:NO completionHandler:^(NSError *errorOrNil){
[newDoc updateChangeCount:NSChangeCleared];
}];我知道这不干净。
发布于 2014-05-07 16:00:00
您是否尝试过使用-NSDocument readFromURL:ofType:error:或-NSDocument readFromData:ofType:error:方法在空的NSDocument实例中加载模板的内容?
https://stackoverflow.com/questions/21060037
复制相似问题