2013-05-29 3 views
0

dragBox라는 NSBox 하위 클래스가 있습니다. 캔버스 주위로 드래그 할 수 있기를 원합니다. 코드는 다음과 같습니다 :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; 

} 

왜 dragEntered가 호출되지 않습니까? 나는 모든 보드 유형 등을 사용하려고했습니다. 아무것도 작동하는 것 같습니다. 또한 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. 지금 드래그 NSModifiedBox에 XIB 및 수정에 NSBox의 클래스를 NSBox을 삭제합니다.
  2. "draggingEntered"메서드에 중단 점을 설정하십시오.
  3. 지금 파일 ".gif 중요"A ".PNG"또는 드래그 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을 참조하십시오.