2009-02-26 5 views
1

내 NSTextField에 아무것도 놓지 못하게하고 싶습니다. 내 앱에서 사용자는 iCal 이벤트를 GUI의 다른 부분으로 드래그 앤 드롭 할 수 있습니다. 이제 우연히 iCal 이벤트를 텍스트 필드에 떨어 뜨린 테스트 사용자가 생겼습니다. 그러나 텍스트가 한 줄짜리 텍스트 필드 위에 보이는 줄 위에 삽입 되었기 때문에이 사실을 인식하지 못했습니다.NSTextField에 대해 드래그 앤 드롭을 사용 중지하는 방법은 무엇입니까?

(텍스트 필드를 클릭하고 키보드를 사용하여 한 줄 위로 올리면 삽입 된 텍스트를 표시 할 수 있지만 일반 사용자는 삽입 된 텍스트가 삽입되었음을 알지 못해서이 작업을 수행하지 않습니다. 처음에!)

내가 어떤 효과를 갖고있는 것 같다)뿐만 아니라 NSDragOperationNone을 반환하는 draggingEntered: 대리자 메서드를 구현하지 않습니다 (registerForDraggedTypes:[NSArray array]] 시도 (위임 방법은도) 호출되지 않습니다.

아이디어가 있으십니까?

편집 : 포커스가있을 때 his blog에와 comments to a blog entry by Daniel Jalkut에서 SSP에 의해 설명 된 바와 같이 NSTextField있는에 뭔가를 떨어 물론 만 작동합니다.

답변

3

: 텍스트 필드가 숨겨져되면 수퍼은 드래그/드롭 이벤트를 잡을 또는 수퍼 구현하거나 드래그/그들이 예를 들어

를 삭제됩니다 드롭하지 않을 경우 수있을 것입니다 이것은 작동 할 수 있습니다 : NSTextView를 서브 클래스 화하고 을 구현하여 nil을 리턴하면 텍스트보기가 끌기 대상으로 사용 불가능하게됩니다. NSDragOperationNone을 반환하려면 NSDraggingDestination 메서드 -draggingEntered:-draggingUpdated:을 구현해야했습니다.

@implementation NoDragTextView 
- (NSArray *)acceptableDragTypes 
{ 
    return nil; 
} 
- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
- (NSDragOperation)draggingUpdated:(id<NSDraggingInfo>)sender 
{ 
    return NSDragOperationNone; 
} 
@end 
+0

시도하지 않았지만 유망한 접근 방법처럼 들립니다. –

-1

NSView에서

- (void)unregisterDraggedTypes
을 사용해 보셨습니까?

+0

마침내 시도해 보았습니다. (필자는 설명서가 제대로 작동해야한다고 동의합니다.) 내 컨트롤러의 awakeFromNib에서 NSTextField 콘센트에서 unregisterDraggedTypes를 호출합니다. 그러나 이것은 아무런 효과가없는 것처럼 보입니다 ... 나는 여전히 나의 들판으로 물건들을 끌 수 있습니다. –

+0

디버거에서 콘센트를 점검하여 연결되어 있는지 확인하고 unregisterDraggedTypes가 호출 될 때 NULL이 아닌지 확인 했습니까? – Mark

+0

이것은 작동하지 않습니다. – Padraig

3

내 블로그 게시물의 댓글을 발견하게되어 기쁩니다. 나는 그들이 당신이 찾고있는 것을 성취하는 방법을 발견하는 빙산의 일각이라고 생각합니다.

포커스가있을 때 NSTextField로 드래그하는 이유는 NSTextField 자체가 더 풍부하고 강력한 뷰 (NSTextView)에 의해 일시적으로 가려진다는 것을 명심해야합니다.이 뷰는 "Field 편집자."

체크 아웃 필드 편집기에 애플의 문서의이 섹션 :

http://developer.apple.com/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html

당신을 위해 노력하고 무엇을 달성하려면, 난 당신에 대한 필드 편집기의 표준 제공을 차단해야 할 수 있습니다 생각하여 NSTextFields, 윈도우 대리자 메서드를 구현하여 :

windowWillReturnFieldEditor : toObject :

이렇게하면 일의 구성을 조정할 중 수있는 기회를 제공합니다 e NSTextView를 사용하거나 완전히 새로운 필드 편집기 객체를 제공하십시오.

최악의 경우 모든 드래그를 거부하도록 설계된 필드 편집기로 NSTextView 하위 클래스를 제공 할 수 있습니다.

2

사용자 지정 NSTextView를 만들고 NSDraggingDestination 프로토콜 입력 및 종료 메서드를 구현하여 NSTextView를 숨김으로 설정하여이 문제를 해결할 수있었습니다.

- (NSDragOperation)draggingEntered:(id<NSDraggingInfo>)sender { 

    //hide so that the drop event falls through into superview's drag/drop view 
    [self setHidden:YES]; 

    return NSDragOperationNone; 
} 

- (void)draggingExited:(id<NSDraggingInfo>)sender { 

    //show our field editor again since dragging is all over with 
    [self setHidden:NO]; 

} 
관련 문제