NSDocument 负责将其可恢复状态编码到 中-encodeRestorableStateWithCoder:
,NSDocumentController 负责解码文档的可恢复状态并重新打开 中的文档+restoreWindowWithIdentifier:state:completionHandler:
。请参阅 中的有用评论NSDocumentRestoration.h
。
当 NSDocument 对 URL 进行编码时,它似乎使用了 NSURL 的书签方法。问题是这些方法仅适用于文件系统 URL。(非文件 URL 可能会编码,但它们不会正确解码。)
要解决此问题,请覆盖使用自定义方案的 NSDocument 实例的编码,以及对这些文档的解码。
NSDocument 子类:
- (void) encodeRestorableStateWithCoder:(NSCoder *) coder {
if ([self.fileURL.scheme isEqualToString:@"customscheme"])
[coder encodeObject:self.fileURL forKey:@"MyDocumentAutoreopenURL"];
else
[super encodeRestorableStateWithCoder:coder];
}
NSDocumentController 子类:
+ (void) restoreWindowWithIdentifier:(NSString *) identifier
state:(NSCoder *) state
completionHandler:(void (^)(NSWindow *, NSError *)) completionHandler {
NSURL *autoreopenURL = [state decodeObjectForKey:@"MyDocumentAutoreopenURL"];
if (autoreopenURL) {
[[self sharedDocumentController]
reopenDocumentForURL:autoreopenURL
withContentsOfURL:autoreopenURL
display:NO
completionHandler:^(NSDocument *document, BOOL documentWasAlreadyOpen, NSError *error) {
NSWindow *resultWindow = nil;
if (!documentWasAlreadyOpen) {
if (![[document windowControllers] count])
[document makeWindowControllers];
if (1 == document.windowControllers.count)
resultWindow = [[document.windowControllers objectAtIndex:0] window];
else {
for (NSWindowController *wc in document.windowControllers)
if ([wc.window.identifier isEqual:identifier]) {
resultWindow = wc.window;
break;
}
}
}
completionHandler(resultWindow, error);
}
];
} else
[super restoreWindowWithIdentifier:identifier
state:state
completionHandler:completionHandler];
}
行为或完成处理程序遵循 Apple 在 NSDocumentRestoration.h 中的方法注释,应该与super
's 大致相同。