2011-01-08 1 views
5

오늘까지 NSWindow 자체 이외의 다른 것을 NSDraggingDestination으로 사용할 기회가 없었습니다. 한 크기의 모든 드래그 대상으로 창을 사용할 때 NSWindow는 해당 메시지를 대리자에게 전달하여 NSWindow를 서브 클래 싱하지 않고 드롭을 처리 할 수있게합니다.코코아 NSTextField 드래그 앤 드롭에는 서브 클래스가 필요합니다 ... 정말요?

docs 말 : NSDraggingDestination 비공식 프로토콜로 선언 하지만

, 당신이 프로토콜을 채택하도록 만들 NSWindow 표시 및 NSView의 서브 클래스는 관련되어 그 메소드를 구현하면된다. NSWindow와 NSView 클래스는 모든 메서드에 대해 전용 구현을 제공합니다. 해당 창 개체 또는 대리자가이 메서드를 구현할 수 있습니다. 그러나 구현에있는 경우 구현이있는 경우 위임자의 구현이 우선합니다.

오늘 저는 두 개의 NSTextField가있는 창을 가지며, 다른 드롭 동작을 사용하기를 원했고 다른 창에서는 드롭을 허용하지 않았습니다. 내가 워드 프로세서를 해석하는 방식으로, NSTextField를 하위 클래스로 만들거나, 다른 드롭 영역 동작을 선택하기 위해 각 뷰에 대해 draggingLocation을 히트 - 체크하는 윈도우 위임자에 거대한 스파게티 조건부 드롭 핸들러를 만드는 것으로 보인다. 각 필드.

중앙 집중식 NSWindow-delegate 기반 드롭 처리기 접근 방식은 드롭 대상 뷰를 소수 이상 사용하지 않는 경우에 부담 스러울 것처럼 보입니다. 마찬가지로, 하위 클래스 화 접근법은 사례에 관계없이 번거로운 것처럼 보입니다. 이제는 드롭 처리 코드가 뷰 클래스에 있기 때문에 드롭을 승인하면 삭제 된 데이터를 모델로 다시 마샬링하는 몇 가지 방법을 생각해 내야합니다. bindings docs은 프로그래밍 방식으로 UI 값을 설정하여 바인딩을 유도하려고한다는 경고를합니다. 그래서 지금 너는 그것의 주위에 당신의 방법 뒤를 작동하는 붙어있어.

내 질문은 : "정말요? 그 중 유일하게 쉽게 사용할 수있는 옵션입니까? 아니면 여기에 뭔가 간단하게 빠져 있습니까?"

감사합니다.

+0

질문 제목에 오타를 수정해야합니다 (NSTextView! = NSTextField). – NSGod

답변

6

좀 더 연구를 마친 후 "네, 실제로 두 옵션은 NSTextField를 하위 클래스로 만들거나 NSWindowDelegate를 사용하여 드롭을 처리하는 것입니다." 나는 더 나아가 두 가지의 더 나은 방법, "단일 창에서 여러 개의 드롭 존을 원한다"는 가든의 다양한 경우에 대해 NSWindowDelegate 메서드를 히트 검사와 함께 사용하는 것이 좋습니다. 보기 측면에 드롭 처리 코드가 있습니다. 내 방 창문을 위임 클래스에 방법을 : :이 draggingUpdated으로 돌아가 셨습니다

- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    NSPasteboard *pboard = [sender draggingPasteboard]; 
    NSDragOperation sourceDragMask = [sender draggingSourceOperationMask]; 

    if ([pboard.types containsObject: NSFilenamesPboardType] && (sourceDragMask & NSDragOperationCopy)) 
    { 
     NSView* hitView = [sender.draggingDestinationWindow.contentView hitTest: sender.draggingLocation]; 
     if (hitView && (hitView == mSourceTextField || hitView == mDestTextField)) 
     { 
      return NSDragOperationCopy;    
     } 
    } 

    return NSDragOperationNone; 
} 

은 물론 전체 그림에 더있다, 그러나 이것은 그러나 hitTest는 : 기반 접근 방식은 지금까지 나를 위해 일했다. NSTableView 또는 NSOutlineView와 같은 다중 NSCell 기반 컨트롤을 사용하는 경우이 방법이 약간 더 복잡 할 수 있습니다.하지만 당연히 이러한 메서드는 자체적 인 끌기 처리 메서드를 사용합니다.

다른 사람에게 도움이되기를 바랍니다.