objective-c - 从默认 NSSavePanel 获取文件 URL 路径

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

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

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

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

- (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 在 block 内不起作用,因此它要么使用默认保存面板获取文件类型而不是文件 URL,要么从以下位置获取文件 URL自定义保存面板而不是文件类型...至少不是 fileTypeFromLastRunSavePanel

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

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

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

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

编辑2:只是为了真正明确我在这里问的问题,如何获取用户从默认 NSSavePanel savePanel 中选择的 URL,而不是我自己的 NSSavePanel savePanel 实例? 我可以这样做吗?这不需要创建 NSSavePanel 的子类并重写其方法吗?我认为向您提供对用户在默认 savePanel 中选择的文件的某种 URL 引用是有意义的,而无需将该功能添加到您自己的 NSSavePanel 实例中。

最佳答案

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

关于objective-c - 从默认 NSSavePanel 获取文件 URL 路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19186761/

相关文章:

iphone - 在 iPhone 5 的横向模式下启动启动画面

xcode - Cocoa:NSMutableAttributedString - 有更好的方法来添加粗体吗?

swift - 自定义 NSTableView 表头、背景色、去除边框

objective-c - 在 NSTableView 中创建自定义单元格

osx-snow-leopard - 有没有人在 Snow Leopard 中成功地将 mach_inject 用于 Finder?

ios - 程序 block 乱序执行?

objective-c - 从不同线程返回后在 UITableView 上设置 contentInset

iOS 7 UINavigationBar 外观第一次不工作......

objective-c - 在 Snow Leopard 上运行时程序崩溃

postgresql - 如何在我的 Mac 上卸载 postgresql(运行 Snow Leopard)