从默认NSSavePanel获取文件URL路径

时间:2013-10-04 16:54:26

标签: objective-c cocoa osx-snow-leopard nssavepanel

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

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

例如,我不想使用这种方法,我不想在-(void)saveDocumentAs:sender中使用以下内容替换默认NSDocument

- (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实例的情况下获得它?
  6. 编辑:我在NSDocument子类的

    中尝试了[self fileURL]
    - (NSData *)dataOfType:(NSString *)typeName error:(NSError **)outError
    

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

    编辑2:只是为了明确说明我在这里要问的内容,如何从默认的NSSavePanel savePanel获取用户选择的URL,而不是我自己的NSSavePanel的savePanel实例?我能做什么这没有创建NSSavePanel的子类并重写其方法?我认为有必要为用户在默认savePanel中选择的文件提供某种URL引用,而不必将该功能添加到您自己的NSSavePanel实例。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

如果您查看NSSavePanel reference documentation,则会清楚地显示URL方法,其中指出:

  

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

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

答案 3 :(得分:0)

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