NSOpenPanel setAllowedFileTypes

时间:2010-11-27 22:06:12

标签: objective-c nsopenpanel

我有一个NSOpenPanel。但我想让它只能选择PDF文件。我正在寻找类似的东西:

// NOT WORKING 
NSOpenPanel *panel;

panel = [NSOpenPanel openPanel];
[panel setFloatingPanel:YES];
[panel setCanChooseDirectories:YES];
[panel setCanChooseFiles:YES];
[panel setAllowsMultipleSelection:YES];
[panel setAllowedFileTypes:[NSArray arrayWithObject:@"pdf"]];
int i = [panel runModalForTypes:nil];
if(i == NSOKButton){
    return [panel filenames];
}

我希望someboby有一个解决方案。

2 个答案:

答案 0 :(得分:27)

我注意到了几件事情......将setCanChooseDirectories改为NO。启用时,表示文件夹是有效输入。这很可能不是您想要的功能。对于区分大小写的系统,您可能还希望将允许的文件类型更改为[NSArray arrayWithObject:@"pdf", @"PDF", nil]runModalForTypes应该是文件类型的数组。将代码更改为如下所示:

// WORKING :)
NSOpenPanel *panel;
NSArray* fileTypes = [NSArray arrayWithObjects:@"pdf", @"PDF", nil];
panel = [NSOpenPanel openPanel];
[panel setFloatingPanel:YES];
[panel setCanChooseDirectories:NO];
[panel setCanChooseFiles:YES];
[panel setAllowsMultipleSelection:YES];
[panel setAllowedFileTypes:fileTypes];
int i = [panel runModal];
if(i == NSOKButton){
    return [panel URLs];
}

Swift 4.2:

let fileTypes = ["jpg", "png", "jpeg"]
let panel = NSOpenPanel()
panel.canChooseFiles = true
panel.canChooseDirectories = false
panel.allowsMultipleSelection = false
panel.allowedFileTypes = fileTypes
panel.beginSheetModal(for: window) { (result) in
    if result.rawValue == NSApplication.ModalResponse.OK.rawValue {
         // Do something with the result.
         let selectedFolder = panel.urls[0]
         print(selectedFolder)
    }
}

答案 1 :(得分:1)

你非常接近答案。

首先,摆脱[panel setCanChooseDirectories:YES],以便它不会允许目录作为结果。

然后,将[panel runModalForTypes:nil]更改为[panel runModal]或取消对[panel setAllowedFileTypes:]的调用,并将数组传递给[panel runModalForTypes:]

相关问题