2013-05-29 2 views
0

У меня есть подкласс NSBox под названием dragBox. Я хочу, чтобы можно было перетащить его вокруг холста. Код выглядит следующим образом:draggingEntered не называется

-(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; 

} 

Почему не перетаскивается вызов? Я попытался использовать все типы pboard и т. Д. Ничто не работает. Я также изменил registerForDraggedTypes, чтобы просто отключиться от представления [self]. Коробка является подзоном холста.

Брюс

ответ

1

Брюс,

нужен Ваш код будет изменен в поле ниже образом. Я считаю, что представление должно быть зарегистрировано для типов перетаскивания, чтобы заставить метод draggingEntered для вызова.

@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. Теперь перетащите NSBox на XIb и Modify класс NSBox к NSModifiedBox.
  2. Установить точку останова на метод «draggingEntered».
  3. Теперь Перетащите «.png» или «.gif» файл и поместите на NSModifiedBox и вы видите „draggingEntered“ получит вызывается
  4. Или вы можете проверить с помощью NSLog, а внутри " draggingEntered».

Надеюсь мой ответ поможет :)

+1

Регистрация при каждом вызове 'drawRect:' - это плохая идея. Установите контрольную точку здесь, чтобы понять, что я имею в виду. Его называют тонной. Вы должны сделать это в 'initWithFrame:' ​​вместо этого. –

+1

Согласен с «Sam Soffes», код может быть изменен и зарегистрирован в «initWithFrame». DrawRect будет вызываться каждый раз, когда когда-либо будет обновление на представлении, а также будет зарегистрировано снова, даже если оно –

3

я обнаружил, что awakeFromNib было неправильное место, чтобы поместить мои registerForDragTypes позвонить. Я должен был поставить его в initWithFrame:

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

    return self; 
} 

Я думаю, что это, возможно, придется делать с тем, что я программно добавляющим видом на другой вид в моем окне. См. this post.