2010-07-14 4 views
0

전 화면 (현재 스텁 함수)을 토글하는 NSMenuItem에 노출 된 esc 키를 바인딩하려고합니다. 수동으로 메뉴 항목을 선택하면 원하는 IBAction이 전송됩니다. NSMenuItem의 Key Equiv를 설정할 때. Interface Builder에서 키 명령이 원하는 IBAction을 전송하는 임의의 베어 키 (예 : .wm)에 연결합니다. Key Equiv를 설정할 때. command + esc, 해당 키 명령은 원하는 IBAction을 보냅니다. 그러나 노출 된 esc 키는 무시됩니다.NSMenuItem 및 노출 된 esc 키 equiv

나는 esc 키가 특별한 경우라고 가정하고 있습니다. 다른 응용 프로그램 (예 : Bannister의 다양한 에뮬레이터)이이를 달성 할 수 있습니까?

답변

1

나는 객관적이고 베테랑이 아니므로 질문을 오해하고있는 경우 사과드립니다. 하지만 NSWindow에서 응답 체인을 이동하고 keyDown 이벤트를 잡아 내려고 시도한 적이 있습니까? 예 :

- (void)keyDown: (NSEvent *) event { 
    if ([event keyCode] == 53) { 
     NSLog(@"Esc. pressed"); 
    } 
} 

물론이 솔루션을 사용하려면 NSWindow를 하위 클래스로 만들어야합니다.

+0

감사합니다. 나는 일반적인 사용 문제를 해결하기 때문에 이것을 받아 들였다. 불행히도 그것은 내 특정 문제의 절반 만 해결합니다 (제 질문에서 말했습니다). 하위 클래스 인 NSWindow를 사용하지 않는 전체 화면 모드로 전환하려면 enterFullScreenMode : withOptions :를 사용하고 있습니다. 이 솔루션을 사용하면 입력 할 수 있지만 전체 화면 모드를 종료 할 수는 없습니다. 애플의 GLFullScreen 예제 코드는 나에게 남은 시간을 가져다 줄 것이다.

+0

내가 잘못하지 않는 한 NSView 내에 keyDown을 구현해야합니다. 이것에 관심이있을 수 있습니다 : http://www.mail-archive.com/[email protected]/msg03851.html – ndg

+0

구현 keyDown : 내 NSOpenGLView 하위 클래스에서 일했습니다. 이것은 여전히 ​​모두 임의의 마법처럼 보인다 ... 고마워! –

1

Esc 키를 단단히 NSRespondercancelOperation 클래스에 바인딩 : 사용자는 다음과 같은 상황에서 Esc 키를 누를 수 있습니다.

시도는 NSWindow를 서브 클래 싱과이 방법을 제공합니다 :

- (void)cancelOperation:(id)sender { 
    if (![SomeController doSomeAction]) { 
    [super cancelOperation:sender]; 
    } 
} 

귀하의 창은 다음 Esc 키에 반응 doSomeAction을 불러 일으킬 것이다. 그 방법은 귀하의 NSMenuItem가 전화하기를 좋아했을 것이지만, 그렇게하기를 거부했습니다.

doSomeAction 메서드에서 동작이 실제로 무엇을했는지 여부를 나타내는 부울을 반환해야합니다. 그랬다면 좋았어. 그렇지 않은 경우 (NO을 반환 한 경우) NSWindow은 Escape 키 이벤트를 체인의 다음 응답자에게 전달합니다.

나는 키 누름이 실제로 무언가를했는지 여부에 대한 사용자의 피드백을 사용자에게 제공하기 때문에이 솔루션을 좋아합니다. 왜냐하면 당신의 방법이 아무런 일도하지 않았고 어떤 다른 변호사도 아무 것도하지 않았다면, "삑"소리가 나기 때문입니다.

첨부 된 창없이 NSViewsuper 대신 [self nextResponder]을 사용해야 할 수도 있습니다.

관련 문제