objective-c - NSSavePanel 使用 AccessoryView 更改文件扩展名

标签 objective-c macos cocoa osx-mountain-lion

我有 NSSavePanelaccessoryView 让用户选择图形格式,以便他们可以将图像 (NSImage) 保存为文件。到目前为止,我有以下内容。 (为了简短起见,我跳过了一些行。)

- (void)exportFile {    
    NSString *filename;
    if (formatIndex1 == 0) { // Default selection by user in Preferences
        filename = @"Untitled.bmp";
    }
    else if (formatIndex1 == 1) {
        filename = @"Untitled.gif";
    }
    ...

    [panel setAllowedFileTypes:[[NSArray alloc] initWithObjects:@"bmp",@"gif",@"jpg",@"jp2",@"png",nil]];
    [panel setAllowsOtherFileTypes:NO];
    [panel setExtensionHidden:NO];
    [panel setCanCreateDirectories:YES];
    [panel setNameFieldStringValue:filename];
    [panel setAccessoryView:accessoryView1];
    [formatMenu1 setAction:@selector(dropMenuChange:)]; // formatMenu1 is NSPopUpButton
    [formatMenu1 setTarget:self];

    [panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {
            // getting panel url
        }
    }];
}

-(void)dropMenuChange:(NSPopUpButton *)sender { 
    NSSavePanel *savePanel = (NSSavePanel *)[sender window];
    [savePanel setNameFieldStringValue:@"..."];
}

我不能 100% 确定我做的是对的。我想要实现的是,每当用户在 accessoryView 的 NSPopUpButton 上选择文件格式时,我想将正确的扩展名附加到当前文件名。有没有一种神奇的方法可以做到这一点?或者我是否必须以编程方式为我自己设置当前文件名和正确的扩展名 setNameFieldStringValue

感谢您的帮助。

最佳答案

我想要实现的是,每当用户在 accessoryView 的 NSPopUpButton 上选择文件格式时,我想将正确的扩展名附加到当前文件名。有没有一种神奇的方法可以做到这一点?

是的,有。你不需要自己用 setNameFieldStringValue: 来做,让 savePanel 来做。让我们假设 fileName 是一个完整路径,例如 /Users/hg/Pictures/2013/08/Airplanes/pic123.png 并且它存在一个用于 savePanel 的 accessoryView 和 单选按钮矩阵。每个按钮都有一个标题,如@"jpg"或@"png"或...矩阵的操作是 -selectFileType:

- (IBAction) selectFileType:(id)sender
{
    [savePanel setAllowedFileTypes:@[ [[sender selectedCell] title] ] ];
    // this will set the right extension
}

为了使用 savePanel,我尝试了以下代码:

- (void) saveImage:(NSImage *) theImg
{
  savePanel = [NSSavePanel savePanel];
  NSString *imageName = [fileName lastPathComponent];
  NSString *suffix = [imageName pathExtension];
  NSString *baseName = [imageName stringByDeletingPathExtension];

  // prepare the savePanel
  [savePanel setAccessoryView:accessoryView];
  [savePanel setAllowedFileTypes:@[ suffix ] ];
  [savePanel setDirectoryURL:[NSURL fileURLWithPath:fileName]];  // convert to URL
  [savePanel setNameFieldStringValue:baseName ];  // without extension !
  // savePanel does append the suffix

  // and now start the savePanel and choose the wanted fileType
  int rtn = [savePanel runModal];   // preferred method since 10.6
  if( rtn==NSFileHandlingPanelCancelButton) return;    // do nothing

  // finally create and save the file
  if( [[[savePanel allowedFileTypes] objectAtIndex:0] isEqualToString:@"jpg" ){
      // save as jpg-file
  }
  // check for other fileTypes
  . . . 
}

关于objective-c - NSSavePanel 使用 AccessoryView 更改文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18444448/

相关文章:

ios - 检查respondsToSelector 中的属性

macos - jmeter 未在 mac osx 中使用brew 下载

macos - 禁止从 Docker for Mac 上的 Docker 容器出站

c# - 是否可以从 Visual Studio 编译 C# 程序以在 Mac 上运行?

objective-c - 如何更改 NSString 颜色?

objective-c - NSPerformService "Tweet"与图像 (Twitter.app)

ios - 下载时播放音频而不下载文件两次?

objective-c - 使用 objective-c 文件创建 swift cocoa touch 框架

macos - 合并 GCD 文件系统事件

cocoa - 将 sqlite 框架添加到桌面 Mac 应用程序