Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSOpenPanel setAllowedFileTypes

I have a NSOpenPanel. But I want to make it PDF-files selectable only. I'm looking for something like that:

// 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];
}

I hope someboby has a solution.

like image 750
Andreas Prang Avatar asked Nov 27 '10 22:11

Andreas Prang


2 Answers

A couple things I noticed.. change setCanChooseDirectoriesto NO. When enabled this indicates that folders are valid input. This is most likely not the functionality you want. You might also want to change your allowed file types to [NSArray arrayWithObject:@"pdf", @"PDF", nil] for case sensitive systems. runModalForTypes should be the array of file types. Change your code to look like this:

// 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)
    }
}
like image 125
Justin Meiners Avatar answered Oct 20 '22 00:10

Justin Meiners


You are very close to the answer.

First, get rid of [panel setCanChooseDirectories:YES] so that it won't allow directories as a result.

Then, either change[panel runModalForTypes:nil] to [panel runModal] or get rid of the call to [panel setAllowedFileTypes:] and pass the array to [panel runModalForTypes:] instead.

like image 43
ughoavgfhw Avatar answered Oct 19 '22 22:10

ughoavgfhw