1

如何从默认的“另存为”对话框表中获取文件 URL?我在 Xcode 中使用带有 Snow Leopard 10.6 SDK 的基于文档的应用程序。

我已经搜索了两天的互联网和 Apple 文档,只找到了使用“另存为”对话框表的唯一实例的答案;每个人似乎都想通过制作自己的文件 -> 保存功能来重新发明轮子,但这不是我想要做的——我已经做到了!

例如,我不想使用这种方法,我不想用类似的东西替换默认-(void)saveDocumentAs:senderNSDocument

- (IBAction)saveFileAs:(id)sender
{
    NSSavePanel *spanel = [NSSavePanel savePanel];
    [spanel setCanCreateDirectories:YES];
    [spanel setCanSelectHiddenExtension:YES];
    [spanel setAllowedFileTypes:[[self currentDocument] writableTypesForSaveOperation:NSSaveAsOperation]];
    [spanel setTreatsFilePackagesAsDirectories:YES];
    [spanel beginSheetModalForWindow: [[[[self currentDocument] windowControllers] objectAtIndex:0] window]  completionHandler:^(NSInteger result)
     {
         if (result == NSFileHandlingPanelOKButton)
         {
             NSString *type = [[self currentDocument] fileTypeFromLastRunSavePanel];
             NSLog(@"%@", type);
             NSURL *saveURL = [spanel URL];
             NSLog(@"%@", saveURL);
             [[self currentDocument] dataOfType:type error:nil];

         }
     }];
}

NSSavePanel相反,我想要的只是用户从默认工作表中为其文件选择的文件 URL 。因为,正如您从这个测试中看到的fileTypeFromLastRunSavePanel那样,它在块中不起作用,所以它要么使用默认保存面板而不是文件 URL 获取文件类型,要么从自定义保存面板而不是文件获取文件 URL类型...至少不是fileTypeFromLastRunSavePanel.

  1. 用户打开文件
  2. 用户修改文件
  3. 用户执行“另存为...”
  4. 用户输入文件的新名称并按“保存”
  5. 我需要文件的新名称。如何在不创建自己的 savePanel 实例的情况下获得它?

[self fileURL]编辑:我在 NSDocument 子类中尝试过

- (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError

方法,但它返回 null 除非文档已经保存到磁盘。

编辑 2: 只是为了真正明确地澄清我在这里问什么,我如何从默认的 NSSavePanel savePanel 中获取用户选择的 URL,而不是我自己的 NSSavePanel 的 savePanel 实例?我可以在不创建 NSSavePanel 的子类并覆盖其方法的情况下做到这一点吗?我认为您将获得某种对用户在默认 savePanel 中选择的文件的 URL 引用,而不必将该功能添加到您自己的 NSSavePanel 实例中是有意义的。

4

4 回答 4

4
NSSavePanel *panel = [NSSavePanel savePanel];

[panel setMessage:@"Please select a path to create a new database."]; // Message inside modal window
[panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"sqlite3", @"sqlite", @"db", nil]];
[panel setAllowsOtherFileTypes:YES];
[panel setExtensionHidden:NO];
[panel setCanCreateDirectories:YES];
[panel setTitle:@"Create a database"]; // Window title
[panel setNameFieldStringValue:@"Untitled.sqlite3"];

[panel beginWithCompletionHandler:^(NSInteger result){
    if (result == NSFileHandlingPanelOKButton) {
        path = [[panel URL] path];
        url = [panel URL];
    }
}];
于 2015-06-18T12:32:26.760 回答
1

没有“默认”NSSavePanel 这样的东西。您需要创建自己的实例。

于 2015-03-30T18:01:36.570 回答
1

需要注意的-[NSSavePanel savePanel]是,它不像许多类似的 Cocoa API 那样是单例的,它返回一个唯一的实例。您必须将保存面板实例的引用存储在变量中,并在配置保存面板属性时访问它。单击保存按钮时,您还可以访问同一保存面板实例的 URL 属性。

于 2019-05-16T02:14:10.573 回答
0

如果您查看NSSavePanel参考文档,它清楚地显示了该URL方法,它指出:

以 URL 形式返回当前显示在面板中的文件的绝对路径名。

这是我在搜索引擎中输入“NSSavePanel”时出现的第一个结果。

于 2013-10-05T05:25:36.933 回答