0

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

我设法完成了其中的一部分:通过创建我自己的文档控制器,并在 openUntitledDocumentAndDisplay: 内部强制执行如下调用:

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


    return res;
}

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

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

4

3 回答 3

1

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

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

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

于 2015-08-17T11:35:09.133 回答
0

我的应用程序中有类似的事情,在我的情况下,如果用户尝试做某事,我会弹出一个提示说“这需要你先保存文档”,并带有取消或保存的按钮。

如果您想绝对强制它,那么不要使用 saveDocumentAs,只需显示您自己的 NSSavePanel。模态运行它,检查结果,将结果保存在文档中,如果不顺利,再次调用它。您可以通过为其文件路径查找有效值来检查文档是否已保存。

于 2015-06-26T19:00:39.527 回答
0

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

总结一下,供参考:

  1. 在 XIB 中创建自定义 nsdocumentsubclass(没有 XIB -> 应用程序确实完成启动)
  2. 覆盖 openUntitledDocumentAndDisplay

    • (NSData *)dataOfType:(NSString *)typeName 错误:(NSError **)outError;
于 2015-09-01T22:09:21.587 回答