在其文档中,我的应用程序使用了大量与文档路径相关的资源。因此必须先保存文档,然后才能添加资产。如何强制调用NSDocument saveDocumentAs?
我设法完成了其中的一部分:通过创建自己的文档控制器,并在openUntitledDocumentAndDisplay中:强制调用,如下所示:
- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError
{
NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError];
[res saveDocumentAs:self];
return res;
}这会强制显示保存对话框,但不幸的是,我无法检查用户是否按下了取消: saveDocumentAs调用是异步的,并且会立即继续!
有没有办法解决这个问题?
发布于 2015-08-17 19:35:09
我也遇到过类似的问题。通过使用: saveDocumentWithDelegate:(id)delegate didSaveSelector:(SEL)didSaveSelector contextInfo:(void *)contextInfo,您可以将处理推迟(或不延迟)到文档保存对话框完成之后。这意味着你可以找出用户是否取消了。您将处理过程一分为二,做好所需的任何准备工作,然后将其余部分(取决于成功保存)放入另一个方法中。如果你使用类似这样的东西:
[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil];文档将被保存,但重要的是,如果以前没有保存过该文档,则会出现保存对话框,以便用户可以输入文件名。一旦他/她这样做了,或者取消了,你的方法actuallyDoIt:(或者其他)就会被调用。didSave:参数告诉您是否实际发生了保存(本质上,用户是否取消了保存),因此您可以继续,也可以礼貌地向用户发出警告,说明在保存之前不会发生任何事情。
发布于 2015-06-27 03:00:40
我在我的应用程序中也有类似的事情,在我的例子中,如果用户试图做一些事情,我会弹出一个提示,说‘这需要你先保存文档’,并带有取消或保存按钮。
如果你想完全强制它,那么不使用saveDocumentAs,只需显示你自己的NSSavePanel。以模态方式运行它,检查结果,将文档与结果一起保存,如果不顺利,则再次调用它。您可以通过查找文档的文件路径的有效值来检查文档是否已保存。
发布于 2015-09-02 06:09:22
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;
}总结一下以供参考:
- (NSData \*)dataOfType:(NSString \*)typeName error:(NSError \*\*)outError;
https://stackoverflow.com/questions/31080031
复制相似问题