在一个简单的 rtf 编辑器(基于 NSDocument 子类)中,当应用程序启动时,它会创建一个无标题文件。这是一个理想的行为。但是,如果我用这个打开的、未编辑的和未保存的文档(空!)退出应用程序,应用程序将在下次启动时恢复此文档。
如何设置此文档以使其无法恢复。如果我在 IB 中取消选中窗口的控制器窗口“可恢复”属性,则不会恢复任何文档,这不是理想的行为:需要恢复用户未关闭的已编辑保存的文档;untitled-unedited 文件不应该!
在一个简单的 rtf 编辑器(基于 NSDocument 子类)中,当应用程序启动时,它会创建一个无标题文件。这是一个理想的行为。但是,如果我用这个打开的、未编辑的和未保存的文档(空!)退出应用程序,应用程序将在下次启动时恢复此文档。
如何设置此文档以使其无法恢复。如果我在 IB 中取消选中窗口的控制器窗口“可恢复”属性,则不会恢复任何文档,这不是理想的行为:需要恢复用户未关闭的已编辑保存的文档;untitled-unedited 文件不应该!
我找到了解决方案。首先,我将 NSDocumentController 子类化并添加到它的实现文件中:
+ (void)restoreWindowWithIdentifier:(NSString *)identifier state:(NSCoder *)state completionHandler:(void (^)(NSWindow *, NSError *))completionHandler
{
NSInteger restorable = [state decodeIntegerForKey:@"restorable"];
if (!restorable) {
completionHandler(nil, [NSError errorWithDomain:NSCocoaErrorDomain code:NSUserCancelledError userInfo:nil]);
}
else {
[super restoreWindowWithIdentifier:identifier state:state completionHandler:completionHandler];
}
}
然后我在我的 NSDocument 子类实现文件中添加了代码
- (void) encodeRestorableStateWithCoder:(NSCoder *) coder {
if (self.fileURL){
[coder encodeInteger:1 forKey:@"restorable"];
} else {
[coder encodeInteger:0 forKey:@"restorable"];
}
[super encodeRestorableStateWithCoder:coder];
}
因此,对于任何具有 nil fileURL 的无标题文档,该标志都设置为 0,并且不会恢复启动。其他文件被恢复。