2013-05-29 128 views
0

我有一個名爲dragBox的NSBox子類。我希望能夠在畫布上拖動它。代碼如下:draggingEntered not called

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

} 

爲什麼不調用dragEntered?我曾嘗試使用所有的紙板類型等。似乎沒有任何工作。我也將registerForDraggedTypes更改爲[self]視圖。該框是畫布的子視圖。

布魯斯

回答

1

布魯斯,

你的代碼需要在下面的方式來改變。我相信這個視圖應該被註冊爲拖動類型,以使dragingEntered方法被調用。

@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和修改刪除一個NSBox到NSModifiedBox。
  2. 設置一個斷點爲「draggingEntered」方法。
  3. 現在拖動的「巴紐」或符「.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