2009-07-01 4 views
2

다음은 샘플 코드입니다.- (void) keyDown : (NSEvent *) 이벤트가 작동하지 않습니다.

- (void) keyDown: (NSEvent *) event 
{ 
    NSString *chars = [event characters]; 
    unichar character = [chars characterAtIndex: 0]; 

    if (character == 27) { 
     NSLog (@"ESCAPE!"); 
    } 
} 

위임자를 InterfaceBuilder 또는 기타 바인딩으로 설정해야합니까?

도움말 높이 평가 ...

+2

keyDown : 메소드는 어디에 구현 되었습니까? –

+0

이스케이프 키를 처리해야하는 경우 NSResponder 하위 클래스에서'cancelOperation :'을 무시하는 것이 좋습니다. – Andriy

답변

4

keyDown는 그 객체 첫 번째로 반응로 설정되는 NSView 서브 클래스에서 재정의 될 필요가있다. 응답자 체인 이 이벤트를 전달해야하지만 사용자가이 이벤트를 수신하게하려면 해당 객체가 첫 번째 응답자인지 확인해야합니다.

+0

이러한 유용한 정보를 보내 주셔서 감사합니다 ... –

0

코코아에서만이 이벤트의 응답 체인에 참여합니다. 따라서 일부 뷰 메서드를 재정의해야합니다. 쉬운 방법은 처리하려는 특정 이벤트에 대한 첫 번째 응답자가 어떤보기인지 알아내는 것입니다.

창이 응답을 처리하거나 응답 체인에 전달할 수있는 첫 번째 응답자에게 keyDown(with:) stright를 보냅니다. 모든보기가 이벤트를 전달하는 것은 아닙니다. NSCollectionView는 키 이벤트를 전달하지 않습니다. 대신 범프 사운드를 재생합니다.

처리 할 키가 키 대등 문자read more here 일 수도 있습니다. 그렇다면 performKeyEquivalent (with :) 메소드를 대체하여이 유형의 이벤트를 수신해야합니다. 이 이벤트는 다른 누군가가 처리 할 때까지 창에서 모든 하위보기로 전달 된 keyDown 이벤트와 달리 다릅니다.

NSCollectionView keyDown (with :) 메서드는 응답기 체인 위로 키 이벤트를 전달하지 않습니다. 슈퍼 뷰 중 하나에서 이러한 이벤트를 처리하려면 콜렉션 뷰에서 먼저 오버라이드해야하며 스스로 처리하려는 이벤트에 대해 self.nextResponder? .keyDown (with : event)을 호출하여 수동으로 이벤트를 보내야합니다.

관련 문제