【问题标题】:force NSDocument to save after creation创建后强制 NSDocument 保存
【发布时间】:2015-06-26 18:39:17
【问题描述】:

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

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

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


    return res;
}

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

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

【问题讨论】:

    标签: cocoa nsdocument nsdocumentcontroller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 只是我对 cocoa 框架的经验并不多,而且 NSSavePanel 看起来相当令人生畏。但我想我确实别无选择。感谢您的信息!
      • 我成功了!但是在调用 [saveToURL:url] 之后,“Save...”菜单项仍然变暗!即使修改文档后,我也无法保存:-(打开文档(为空)将允许我再次保存。只有新创建的文档不能保存:-(
      • 调用 updateChangeCount: 以正确指示有东西要保存。更好的是实现撤消操作。
      【解决方案3】:

      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;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多