Question

I've created an app, containing an ImageView subclass which accepts drag'n'dropping files/folders directly from Finder.

The thing is I'm now trying to make it accept photos, either from iPhoto or Aperture, as well.

Which PboardTypes should I register for?

All I'm currently doing is :

    [self registerForDraggedTypes:
     [NSArray arrayWithObjects:NSFilenamesPboardType, nil]];

Any ideas?

Was it helpful?

Solution

Using Pasteboard Peeker (from Apple) shows me that Aperture gives you file names/URLs as well as "aperture image data" (whatever that is). iPhoto appears only to give "ImageDataListPboardType", which is a PLIST. I'm guessing you could NSLog() that out to see its structure and pull the image information from it. It may possibly include the filename/URL info as well as the actual image as data.

OTHER TIPS

You are correct to register for NSFilenamesPboardType. To complete the task:

1: Make sure you accept the copy operation in draggingEntered. The generic operation is insufficient.

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {

    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask];
    NSPasteboard *pasteboard = [sender draggingPasteboard];
    if ( [[pasteboard types] containsObject:NSFilenamesPboardType] ) {
            if (sourceDragMask & NSDragOperationCopy) {
                return NSDragOperationCopy;
            }
    }

    return NSDragOperationNone;
}

2: There will be one filename per photo. Do something with them.

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pasteboard;
    NSDragOperation sourceDragMask;

    sourceDragMask = [sender draggingSourceOperationMask];
    pasteboard = [sender draggingPasteboard];

    if ([[pasteboard types] containsObject:NSFilenamesPboardType])
    {    
         NSData* data = [pasteboard dataForType:NSFilenamesPboardType];        
         if(data)
         {
             NSString *errorDescription;
             NSArray *filenames = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:kCFPropertyListImmutable format:nil errorDescription:&errorDescription];

             for (NSString* filename in filenames)
             {
                 NSImage* image = [[NSImage alloc]initWithContentsOfFile:filename];
                 //Do something with the image
             }
         }
     }

    return YES;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top