NSOpenPanel setAllowedFileTypes
Asked Answered
H

2

16

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.

Honor answered 27/11, 2010 at 22:6 Comment(0)
P
34

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)
    }
}
Persona answered 27/11, 2010 at 22:24 Comment(4)
Doesn't this leak fileTypes?Technocracy
@MKatz thank you for the catch. Without ARC alloc must be followed by release. I will change it to arrayWithObjects:Persona
This doesn't work although no errors are generated. The file selection window opens but all file types are displayed and can be selected normally....using Swift 5 on MacOS Mojave 10.14.5 XCode 11 BetaSaari
panel.allowedFileTypes = [NSImage imageTypes]; (obj-c syntax) to get all image types supported by NSImage.Laszlo
N
2

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.

Norris answered 27/11, 2010 at 22:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.