gpt4 book ai didi

cocoa - 基于文档的应用程序不会恢复具有非文件 URL 的文档

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

我有一个基于 NSDocument 的应用程序,带有 NSDocumentController 子类。我的 NSDocument 可处理文件 URL 和具有使用 Web 服务的自定义方案的 URL。

我使用自定义代码处理大部分加载和保存工作,包括 -saveToURL:ofType:forSaveOperation:completionHandler:+autosavesInPlace 返回 YES

我遇到的问题:具有自定义 URL 方案的文档在启动时不会恢复。具有文件 URL 方案的文档包括保存到文件的常规文档和自动保存的无标题文档。

打开基于服务器的文档并退出应用程序后,重新启动时似乎不会调用任何 NSDocument 方法。特别是,四个初始化器都没有被调用:

  • --初始化
  • --initWithContentsOfURL:ofType:错误:
  • –initForURL:withContentsOfURL:ofType:error:
  • --initWithType:错误:

NSDocumentController 方法 -reopenDocumentForURL:withContentsOfURL:display:completionHandler: 也不会被调用。

如何以及何时对文档的可恢复状态进行编码?它们如何以及何时被解码?

最佳答案

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 大致相同。的。

关于cocoa - 基于文档的应用程序不会恢复具有非文件 URL 的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13848663/

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