首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建后强制NSDocument保存

创建后强制NSDocument保存
EN

Stack Overflow用户
提问于 2015-06-27 02:39:17
回答 3查看 677关注 0票数 0

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

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

代码语言:javascript
复制
- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError **)outError
{
    NSDocument * res = [super openUntitledDocumentAndDisplay:displayDocument error:outError];
    [res saveDocumentAs:self];


    return res;
}

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-08-17 19:35:09

我也遇到过类似的问题。通过使用: saveDocumentWithDelegate:(id)delegate didSaveSelector:(SEL)didSaveSelector contextInfo:(void *)contextInfo,您可以将处理推迟(或不延迟)到文档保存对话框完成之后。这意味着你可以找出用户是否取消了。您将处理过程一分为二,做好所需的任何准备工作,然后将其余部分(取决于成功保存)放入另一个方法中。如果你使用类似这样的东西:

代码语言:javascript
复制
[self saveDocumentWithDelegate:self didSaveSelector:@selector(actuallyDoIt: didSave: contextInfo:) contextInfo:nil];

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-27 03:00:40

我在我的应用程序中也有类似的事情,在我的例子中,如果用户试图做一些事情,我会弹出一个提示,说‘这需要你先保存文档’,并带有取消或保存按钮。

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

票数 0
EN

Stack Overflow用户

发布于 2015-09-02 06:09:22

NSSavePanel可以以模态方式运行。下面是它可以/应该是什么样子。

代码语言:javascript
复制
- (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中创建自定义nsdocument子类(没有XIB ->应用程序完成nsdocumentsubclass

代码语言:javascript
复制
- (NSData \*)dataOfType:(NSString \*)typeName error:(NSError \*\*)outError;

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31080031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档