2015-01-26 3 views
7

스위프트에서 키보드의 키를 눌렀는지 감지하는 방법을 찾고 있습니다. 어떤 아이디어와 제안도 크게 감사 할 것입니다.스위프트에서 키 누르기 이벤트 감지

+1

너 자신을 어떻게 생각하니? –

+2

이것은 중복되지 않습니다. 객관적인 -C 답은 신속한 질문에 대해 중복되지 않습니다. –

+0

어떤 상황에서 키 누르기를 감지하고 싶습니까? 창문에? 입력? –

답변

10

질문을 업데이트했으며 창에 대해이를 수행하는 방법을 알고 싶으므로 다음은 답변입니다. NSWindow를 서브 클래스 화하고이 서브 클래스를 대신 사용하십시오. 당신은/엑스 코드 인터페이스 빌더에서 창을했다면

import Cocoa 

class EditorWindow: NSWindow { 
    override func keyDown(event: NSEvent) { 
     super.keyDown(event) 
     Swift.print("Caught a key down: \(event.keyCode)!") 
    } 
} 

( + 경위를 창 개체를 클릭하고 속성으로 이동 :

사용자 정의 클래스는 다음과 같이한다 +). Attribute Inspector는 오른쪽의 사이드 바에 있습니다. 인터페이스 빌더에서 창을 선택했는지 확인하려면 속성 관리자 상단의 Custom Class 영역에 새 클래스를 클래스 입력에 넣으십시오. 내 응용 프로그램에이 창 클래스에서 이벤트를 전달하기 위해

Attribute Selector

나는 그때 콜백 함수의 배열에 저장하는 콜백 함수를 받아들이는 창에 함수를 추가합니다. 현재 주 창에 약한 참조를 얻을 수있는 AppDelegate를 통해이 창에 액세스 할 수 있습니다. 그런 다음 위의 함수에서 전체 콜백을 반복하고 NSEvent를 인수로 호출합니다. 또한 먼저 이벤트에 대한 modifierFlags 속성을 통해 옵션 키와 같은 명령 키가 먼저 눌러져 있는지 확인합니다. 그것은 다음과 같이 찾고 끝 :

import Cocoa 

typealias Callback = (NSEvent) ->() 

class KeyCaptureWindow: NSWindow { 

    var keyEventListeners = Array<Callback>() 

    override func keyDown(event: NSEvent) { 
     if event.modifierFlags.contains(NSEventModifierFlags.CommandKeyMask) { 
      super.keyDown(event) 
      return 
     } 
     for callback in keyEventListeners { 
      callback(event) 
     } 
    } 

    func addKeyEventCallback(callback: Callback) { 
     keyEventListeners.append(callback) 
    } 


} 

그리고이 후 다른 곳에서 내 코드에서 내가 지금과 같은 라인이 있습니다

let appDelegate = NSApplication.sharedApplication().delegate as! AppDelegate 
    let mainWindow = appDelegate.getWindow() 
    mainWindow.addKeyEventCallback(handleKeyEvent) 

내가 내 응용 프로그램 위임 클래스에 getWindow 방법을 추가합니다. 이 메서드는 캐스팅을 KeyCaptureWindow으로 반환합니다. 이 모든 것을 수행하는 더 좋은 방법이있을 수 있지만 이것은 나를 위해 작동합니다. 이것을 할 수있는 또 다른 방법은 첫 번째 응답자와 NSView을 사용하는 것입니다.하지만 그 방법은 제가 해오 던 방식이 아닙니다.

+0

이것은 정말 도움이됩니다. 정말 고마워요. – andertonslase

+0

컴퓨터에 키보드가 여러 개 연결되어있는 경우 짝수 키보드의 출처를 확인할 수 있습니까? – OrangePot

+1

Swift의 최신 버전이이 기능을 수정했습니다. 이제 keyDown입니다 (이벤트 : NSEvent 포함). 매우 유익한 답변 주셔서 감사합니다! –

5

keyDown -method를 재정의해야합니다.

var direction:String = "" 

override func keyDown(theEvent: NSEvent!) // A key is pressed 
{ 
    if theEvent.keyCode == 123 
    { 
     direction = "left" //get the pressed key 
    } 
    else if theEvent.keyCode == 124 
    { 
     direction = "right" //get the pressed key 
    } 
    println("Key with number: \(theEvent.keyCode) was pressed") 
}