2011-07-06 6 views
6

부모 윈도우의 내용보기를 다루는 NSView가 있습니다. 이보기에는 내용보기에서이를 제거하는 클릭 이벤트 핸들러가 있습니다. 이 견해 안에는 또 다른 견해가 있습니다. 이 내부보기에서 마우스를 끌면 마우스 이벤트가 앞면의보기뿐만 아니라 뒤의보기에도 적용됩니다. 또한보기 뒤의 커서도 표시됩니다. 이것은 여기에서 발생하는 동일한 문제입니다 : NSView overlay passes mouse events to underlying subviews?하지만 다른 창을 열 수 없기 때문에 거기에 대한 대답은 내 프로젝트에서 작동하지 않습니다.NSView를 통해 출혈하는 마우스 이벤트

감사합니다.

+0

맨 위로보기에 대한 이벤트 처리 코드를 게시하십시오. –

답변

12

이벤트 처리 코드를 보지 않고도 어떤 일이 발생했는지 알기는 어렵지만 구현시 다양한 이벤트 처리 메서드를 super에 구현했다고 생각됩니다.

NSViewNSResponder의 하위 클래스이므로 기본적으로 처리되지 않은 이벤트는 응답 체인에 전달됩니다. 보기의 수퍼 뷰는 응답 체인의 다음 객체입니다. 예를 들어 [super mouseDown:event]을 구현하면 ‑mouseDown:으로 호출하면 이벤트가 수퍼 뷰로 전달됩니다.

해결 방법은 이 아닌지 확인하고 이벤트 처리기에서 super을 호출하는 것입니다.

이 잘못된 :

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
    [super mouseDown:event]; 
} 

이 올바른 :

- (void)mouseDown:(NSEvent*)anEvent 
{ 
    //do something 
} 
+1

이것은 마우스 끌기, 커서 업데이트 및 마우스 업을위한 빈 메서드를 구현해야한다는 것을 제외하고는 내 문제였습니다. 이미 마우스 다운을 구현했기 때문입니다. 어떤 이벤트가 커서 변경을 처리합니까? – Maz

+0

그냥'-mouseEntered :'와'-mouseExited :'를 사용하고 그 방법들에서 커서를 설정하십시오. –

+0

이 맞습니다. 내 시야가 잘 작동하고 있습니다. –

2

롭의 대답은 그 대답에 MAZ의 의견은이 문제를 해결하지만, 그냥 절대적으로 명시 할 수 있습니다. NSView가 출혈하는 것을 방지하기 위해 부모에게 마우스 이벤트가 생기면 빈 메서드를 구현해야합니다.

// NSResponder ========================================= 
- (void) mouseDown:(NSEvent*)event {} 
- (void) mouseDragged:(NSEvent*)event {} 
- (void) mouseUp:(NSEvent*)event {}