NSOpenPanel setAllowedFileTypes

У меня есть 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 есть решение.

Ответ 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];
}

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)
    }
}

Ответ 2

Вы очень близки к ответу.

Во-первых, избавиться от [panel setCanChooseDirectories:YES], чтобы он не позволял каталоги в результате.

Затем либо измените [panel runModalForTypes:nil] на [panel runModal], либо избавитесь от вызова [panel setAllowedFileTypes:] и передайте массив [panel runModalForTypes:].