强制NSDocument在创建后保存

时间:2015-06-26 18:39:17

标签: cocoa nsdocument nsdocumentcontroller

在我的文档中,我的应用程序使用了大量与文档路径相关的资产。因此,在添加资产之前必须保存文档。如何强制调用[NSDocument saveDocumentAs]?

我设法做了部分工作:创建我自己的文档控制器,并在openUntitledDocumentAndDisplay中:强制执行如下调用:

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError
{
    NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError];
    [res saveDocumentAs:self];


    return res;
}

这会强制显示保存对话框,但遗憾的是我无法检查用户是否按下了取消:saveDocumentAs调用是异步的并立即继续!

有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:1)

我有类似的问题。通过使用: saveDocumentWithDelegate:(id)委托didSaveSelector:(SEL)didSaveSelector contextInfo:(void *)contextInfo 在文档保存对话完成之前,您可以推迟处理(或不处理)。这意味着您可以了解用户是否已取消。你将处理分成两部分,做你需要的任何准备工作,把剩下的部分(取决于成功保存)放到另一种方法中。如果你使用类似的东西:

[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil];

文档将被保存,但是,如果之前没有保存,则会出现“保存”对话框,以便用户输入文件名。一旦他/她完成了,或取消了,你的方法实际上是:它(或其他)被调用。 didSave:参数告诉您实际上是否发生了保存(实质上是用户取消了),因此您可以继续或提供警报,向用户礼貌地解释在保存之前不会发生任何事情。

答案 1 :(得分:0)

我的应用程序中有类似的内容,在我的情况下,如果用户尝试执行某些操作,我会提示说“这需要您先保存文档”。用按钮取消或保存。

如果你想绝对强制它,那么只需显示你自己的NSSavePanel,而不是使用saveDocumentAs。以模态方式运行,检查结果,使用结果保存文档,如果没有,请顺利进行,再次调用。您可以通过查找文档路径的有效值来检查文档是否已保存。

答案 2 :(得分:0)

NSSavePanel can run modally. Here is how it can/should look like.

- (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;
}

To sum up for reference:

  1. Create custom nsdocumentsubclass in XIB (no XIB -> app did finish launching)
  2. override openUntitledDocumentAndDisplay

    • (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError;