在它的文档中,我的应用程序使用了许多相对于文档路径的资产。因此,必须先保存文档,然后才能添加资产。如何强制调用[NSDocument saveDocumentAs]?
我设法完成了部分工作:通过创建自己的文档控制器,并在openUnttledDocumentAndDisplay中:强制调用如下:
- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError
{
NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError];
[res saveDocumentAs:self];
return res;
}
这将强制显示保存对话框,但不幸的是,我无法检查用户是否按下了cancel:saveDocumentAs调用是异步的,并立即继续!
有办法解决这个问题吗?
我也遇到了类似的问题。通过使用:saveDocumentWithDelegate:(id)delegate didSaveSelector:(SEL)didSave选择器上下文信息:(void*)上下文信息您可以将处理(或不处理)推迟到文档保存对话框完成之后。这意味着您可以了解用户是否已取消。你把处理过程一分为二,做你需要的任何准备,然后把剩下的(取决于成功的保存)放进另一种方法中。如果你使用类似的东西:
[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil];
文档将被保存,但至关重要的是,如果以前没有保存过,则会出现"保存"对话框,以便用户可以输入文件名。一旦他/她完成了或取消了,就会实际调用您的方法DoIt:(或其他任何方法)。didSave:参数告诉保存是否真的发生了(本质上是用户取消了吗),这样你就可以继续,或者礼貌地向用户提供一个警告,解释在他们保存之前不会发生任何事情。
我的应用程序中也有类似的事情,在我的情况下,如果用户试图做某事,我会弹出一个提示,说"这需要你先保存文档",并带有取消或保存按钮。
如果您想绝对强制执行,那么不使用saveDocumentAs,只需显示您自己的NSSavePanel即可。以模式运行它,检查结果,保存带有结果的文档,如果没有;I don’’不太顺利,请再说一遍。您可以通过查找文档的文件路径的有效值来检查文档是否已保存。
NSSavePanel可以模式运行。以下是它的外观。
- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError *__autoreleasing *)outError
{
Document *document;
NSSavePanel *panel = [NSSavePanel savePanel];
panel.prompt = @"Create";
NSInteger modalCode = [panel runModal];
if (modalCode == NSModalResponseOK) {
NSURL *URL = [panel URL];
NSError *docError;
document = [[Document alloc] initWithType:nil & docError];
[document saveToURL:URL ofType:nil forSaveOperation:NSSaveOperation completionHandler:^(NSError *error){
if(error) {
return nil;
}
[self addDocument:document];
[document makeWindowControllers];
if (displayDocument) {
[document showWindows];
}
}];
}
return document;
}
总结以供参考:
- 在XIB中创建自定义nsdocumentsubclass(没有XIB->应用程序完成启动)
覆盖打开未标记的文档和显示
- (NSData*)dataOfType:(NSString*)typeName错误:(NSError**)outError