7

Currently there is a button on my app inteface which allow to open a file, here is my open code:

In my app.h:

- (IBAction)selectFile:(id)sender;

In my app.m:

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {

}

- (IBAction)selectFile:(id)sender {

    NSOpenPanel *openPanel  = [NSOpenPanel openPanel];
    NSArray *fileTypes = [NSArray arrayWithObjects:@"xml",nil];

    NSInteger result  = [openPanel runModalForDirectory:NSHomeDirectory() file:nil types:fileTypes ];

    if(result == NSOKButton){

        NSString * input =  [openPanel filename];

How can I edit my code to allow opening with the application-icon drag & drop?
Note: I edited the .plist file and added a line for "xml" but it change anything, got an error when my file is dropped on the icon.
Note 2: I linked the "File -> Open..." to the selectFile: wich refer to my code
Note 3: My app isn't a document-based application


Thanks for your help!
Miskia

Nono
  • 241
  • 5
  • 15

2 Answers2

16

First add the proper extensions to CFBundleDocumentTypes inside the .plist file.

Next implement the following delegates:
- application:openFile: (one file dropped)
- application:openFiles: (multiple files dropped)

Reference:
NSApplicationDelegate Protocol Reference

Response to comment:

Step by step example, hopefully it makes everything clear :)

Add to the .plist file:

 <key>CFBundleDocumentTypes</key>
        <array>
            <dict>
                <key>CFBundleTypeExtensions</key>
                <array>
                    <string>xml</string>
                </array>
                <key>CFBundleTypeIconFile</key>
                <string>application.icns</string>
                <key>CFBundleTypeMIMETypes</key>
                <array>
                    <string>text/xml</string>
                </array>
                <key>CFBundleTypeName</key>
                <string>XML File</string>
                <key>CFBundleTypeRole</key>
                <string>Viewer</string>
                <key>LSIsAppleDefaultForType</key>
                <true/>
            </dict>
        </array>

Add to ...AppDelegate.h

- (BOOL)processFile:(NSString *)file;
- (IBAction)openFileManually:(id)sender;

Add to ...AppDelegate.m

- (IBAction)openFileManually:(id)sender;
{
    NSOpenPanel *openPanel  = [NSOpenPanel openPanel];
    NSArray *fileTypes = [NSArray arrayWithObjects:@"xml",nil];
    NSInteger result  = [openPanel runModalForDirectory:NSHomeDirectory() file:nil types:fileTypes ];
    if(result == NSOKButton){
        [self processFile:[openPanel filename]];
    }
}

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
{
    return [self processFile:filename];
}

- (BOOL)processFile:(NSString *)file
{
    NSLog(@"The following file has been dropped or selected: %@",file);
    // Process file here
    return  YES; // Return YES when file processed succesfull, else return NO.
}
Anne
  • 26,765
  • 9
  • 65
  • 71
  • I added the proper extensions to CFBundleDocumentTypes (*.xml file) But i don't understand how to configure the delegates... At the time i got a "selectFile" and all of my code depend of the result of my selectFile... how can i work and configure with the selectFile AND the openFile (to allow drag&drop feature)... Thanks for your help! – Nono Mar 16 '11 at 22:10
  • I added some additional info, this explains how to process both dropped and selected files with one piece of code. – Anne Mar 16 '11 at 23:16
  • @Anne this works great. But how can I tweak the plist to accept any file type AND folders? – crewshin Aug 10 '12 at 22:21
  • Found another thread that answered it: http://stackoverflow.com/questions/4356620/cocoa-drag-and-drop-any-file-type – crewshin Aug 11 '12 at 02:55
  • Just an additional info: if you drop something on the icon while the app is NOT running, the "openFile.." methods will be called BEFORE "applicationDidFinishLaunching". – csch Mar 14 '13 at 16:27
  • Great answer! May I ask for an update, cause some functions are deprecated since it was posted. – Silex May 22 '13 at 21:11
0

for a quick&dirty solution:

Cocoa: Drag and Drop any file type

Tested under Xcode Version 11.4 (11E146) catalina 10.15.4 (19E266)

ingconti
  • 10,876
  • 3
  • 61
  • 48