【问题标题】:NSOpenPanel setAllowedFileTypesNSOpenPanel setAllowedFileTypes
【发布时间】:2010-11-27 22:06:11
【问题描述】:

我有一个 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];
}

我希望有人能解决。

【问题讨论】:

    标签: objective-c nsopenpanel


    【解决方案1】:

    我注意到了几件事.. 将 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];
    }
    

    斯威夫特 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)
        }
    }
    

    【讨论】:

    • 这不会泄露文件类型吗?
    • @MKatz 谢谢你的收获。没有 ARC 的 alloc 必须跟在 release 之后。我将其更改为 arrayWithObjects:
    • 这不起作用,虽然没有产生错误。文件选择窗口打开,但显示所有文件类型,可以正常选择....在 MacOS Mojave 10.14.5 XCode 11 Beta 上使用 Swift 5
    • panel.allowedFileTypes = [NSImage imageTypes];(obj-c语法)获取NSImage支持的所有图片类型。
    【解决方案2】:

    你已经非常接近答案了。

    首先,去掉[panel setCanChooseDirectories:YES],这样它就不会允许目录。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多