2012-08-28 5 views
2

Je veux mettre en œuvre un certain "simple" glisser & déposer dans mon application Mac. J'ai glissé dans une vue et entré "MyView" dans mon fichier nib en conséquence.Cependant je n'obtiens aucune réponse dans ma console (j'essaie de consigner les messages chaque fois que l'une des méthodes de protocole est déclenchée)Glisser & déposer (<NSDraggingDestination>) dans Cocoa ne fonctionne pas

J'ai sous-classé NSView comme ceci:

@interface MyView : NSView <NSDraggingDestination>{ 
    NSImageView* imageView; 
} 

et mettre en œuvre comme ceci:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     [self registerForDraggedTypes:[NSImage imagePasteboardTypes]]; 

     NSRect rect = NSMakeRect(150, 0, 400, 300); 
     imageView = [[NSImageView alloc] initWithFrame:rect]; 

     [imageView setImageScaling:NSScaleNone]; 
     [imageView setImage:[NSImage imageNamed:@"test.png"]]; 
     [self addSubview:imageView]; 



    } 

    return self; 
} 


- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender{ 
    NSLog(@"entered"); 
    return NSDragOperationCopy; 

} 

- (NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender{ 
    return NSDragOperationCopy; 

} 


- (void)draggingExited:(id <NSDraggingInfo>)sender{ 
    NSLog(@"exited"); 

} 
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender{ 
    NSLog(@"som"); 
    return YES; 

} 

- (BOOL)performDragOperation:(id<NSDraggingInfo>)sender { 

    NSPasteboard *pboard = [sender draggingPasteboard]; 

    if ([[pboard types] containsObject:NSURLPboardType]) { 
     NSURL *fileURL = [NSURL URLFromPasteboard:pboard]; 
     NSLog(@"%@", fileURL); 
    } 
    return YES; 
} 

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender{ 
    NSLog(@"conclude sth"); 


} 

- (void)draggingEnded:(id <NSDraggingInfo>)sender{ 
    NSLog(@"ended"); 


} 

- (BOOL)wantsPeriodicDraggingUpdates{ 
    NSLog(@"wants updates"); 

} 


- (void)updateDraggingItemsForDrag:(id <NSDraggingInfo>)sender NS_AVAILABLE_MAC(10_7){ 
} 

Répondre

11

Si quelqu'un a encore besoin de cette aide:

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

au lieu de:

[self registerForDraggedTypes: 
         [NSImage imagePasteboardTypes]]; // BAD: dropped image runs away, no draggingdestination protocol methods sent... 

résolu ce problème pour moi. Je suppose que cela fonctionne parce que mon XIB cible OSX 10.5. NSFilenamesPboardType représente une UTI "standard" 10.5 et antérieure et [NSImage imagePasteboardTypes] renvoie des UTIs de données standard 10.6-and-after.

Par ailleurs, dans - (BOOL) performDragOperation: (id NSDraggingInfo) expéditeur, vous pouvez obtenir un chemin pour le fichier qui a été abandonné avec:

NSArray *files = [pboard propertyListForType:NSFilenamesPboardType]; 

suis arrivé ici la solution:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DragandDrop/Tasks/acceptingdrags.html#//apple_ref/doc/uid/20000993-BABHHIHC

+0

imagePasteboardTypes = contenu de l'image seulement –

Questions connexes