NSOpenPanel setAllowedFileTypes - PullRequest
       3

NSOpenPanel setAllowedFileTypes

11 голосов
/ 28 ноября 2010

У меня есть 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];
}

Надеюсь, у кого-нибудь есть решение.

Ответы [ 2 ]

28 голосов
/ 28 ноября 2010

Несколько вещей, которые я заметил ... измените setCanChooseDirectories на НЕТ. Если этот параметр включен, это означает, что папки являются допустимыми. Скорее всего, это не та функциональность, которую вы хотите. Вы также можете изменить разрешенные типы файлов на [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 голос
/ 28 ноября 2010

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

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

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

...