2013-05-29 2 views
0

J'ai une sous-classe NSBox appelée dragBox. Je veux être capable de le faire glisser sur une toile. Le code est le suivant:draggingEnregistré non appelé

-(void) awakeFromNib 
{ 
[[self superview] registerForDraggedTypes:[NSArray arrayWithObject:NSFilenamesPboardType]]; 


} 
-(void) mouseDown:(NSEvent *)theEvent 
{ 
    [self dragImage:[[NSImage alloc] initWithContentsOfFile:@"/Users/bruce/Desktop/Untitled-1.png"] at:NSMakePoint(32, 32) offset:NSMakeSize(0,0) event:theEvent pasteboard:[NSPasteboard pasteboardWithName:NSDragPboard] source:self slideBack:YES]; 




} 
-(NSDragOperation)draggingUpdated:(id <NSDraggingInfo>)sender // validate 
{ 
    NSLog(@"Updated"); 
    return [sender draggingSourceOperationMask]; 

} 

-(NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    NSLog(@"Drag Entered"); 

    return [sender draggingSourceOperationMask]; 

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

NSLog(@"Move Box"); 
[self setFrameOrigin:[sender draggingLocation]]; 


return YES; 
} 

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

} 

Pourquoi dragEntered n'est-il pas appelé? J'ai essayé d'utiliser tous les types de pboard et autres. Rien ne semble fonctionner. J'ai également changé le registerForDraggedTypes pour simplement travailler hors de la vue [self]. La boîte est une sous-vue d'une toile.

Bruce

Répondre

1

Bruce,

Votre code doit être modifié de la façon ci-dessous. Je crois que cette vue doit être enregistrée pour les types de glisser pour que la méthode draggingEnter soit appelée.

@interface NSModifiedBox : NSBox 

@end 


@implementation NSModifiedBox 
- (void)drawRect:(NSRect)dirtyRect 
{ 
    // Drawing code here. 
    [self registerForDraggedTypes: 
    [NSArray arrayWithObjects:NSTIFFPboardType,NSFilenamesPboardType,nil]]; 
    [super drawRect:dirtyRect]; 
} 


- (NSDragOperation)draggingEntered:(id)sender 
{ 
    if ((NSDragOperationGeneric & [sender draggingSourceOperationMask]) 
     == NSDragOperationGeneric) 
    { 

     return NSDragOperationGeneric; 

    } // end if 

    // not a drag we can use 
    return NSDragOperationNone; 

} 

- (BOOL)prepareForDragOperation:(id)sender 
{ 
    return YES; 
} 
@end 
  1. maintenant glisser-déposer un NSBox sur la Xib et Modifier la classe de NSBox à NSModifiedBox.
  2. Définissez un point d'arrêt sur la méthode "draggingEntered".
  3. Maintenant, faites glisser un « .png » ou « .gif » fichier et déposez sur la NSModifiedBox et vous voyez le « draggingEntered » va s'invoqué
  4. Ou vous pouvez vérifier en utilisant NSLog ainsi l'intérieur d'un " draggingEntrer ".

espère que ma réponse vous aidera :)

+1

L'enregistrement à chaque fois que 'drawRect:' est appelé est une mauvaise idée. Définissez un point d'arrêt ici pour voir ce que je veux dire. Ça s'appelle une tonne. Vous devriez le faire dans 'initWithFrame:' ​​à la place. –

+1

D'accord avec "Sam Soffes", le code peut être modifié et enregistré dans "initWithFrame". DrawRect sera invoqué à chaque fois qu'il y aura un rafraîchissement sur la vue et sera enregistré à nouveau même s'il est –

3

Je trouve que awakeFromNib était le bon endroit pour mettre mes registerForDragTypes appel. Je devais le mettre en initWithFrame:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self registerForDraggedTypes: [NSArray arrayWithObjects:NSTIFFPboardType,NSFilenamesPboardType,nil]]; 
    } 

    return self; 
} 

Je pense qu'il peut avoir à voir avec le fait que je suis d'ajouter la programmation en vue d'une autre vue dans ma fenêtre. Voir this post.