强制NSDocument在创建后保存



在它的文档中,我的应用程序使用了许多相对于文档路径的资产。因此,必须先保存文档,然后才能添加资产。如何强制调用[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;
}

总结以供参考:

  1. 在XIB中创建自定义nsdocumentsubclass(没有XIB->应用程序完成启动)
  2. 覆盖打开未标记的文档和显示

    • (NSData*)dataOfType:(NSString*)typeName错误:(NSError**)outError

最新更新