2011-01-29 2 views
2

나는 keydown 액션에 대한 모든 코드를 가지고 있지만, 모든 사이트를 살펴 보는 첫 번째 응답자와 무엇을해야할지 모르겠다. 누구든지 코코아 objectivec에서 keydown 작업을 인식하도록 설정하는 방법을 말해 줄 수 있습니까?OSX의 KeyDown 액션?

감사

답변

4

첫째, keyDown:는 이벤트 메시지,하지 작업 메시지입니다. 인수는 NSEvent이며 NSControl 또는 NSMenuItem과 같은 일종의 UI 객체가 아닙니다.

"첫 번째 응답자"가 특별하지 않은 경우 응답 메시지가 응답 체인에 연결됩니다. 각 응답자는 다음 응답자에게 처리 방법을 알지 못하는 모든 동작 메시지를 전달합니다. 이것은 "응답자 체인"입니다. 첫 번째 응답자는 응답자 체인의 머리 부분에있는 응답자가 무엇이든 간단합니다. 즉, 첫 번째 응답자 체인입니다. 당신은 단순히 그 사슬에 있어야 할 것입니다. 그 사슬은 그 사슬을 따라 내려가는 행동에 어떻게 반응해야하는지 모릅니다.

그러나 이벤트 메시지이므로 사물이 다릅니다. 키 뷰, which is the first responder이어야합니다.

그리고 그게 전부입니다. 보기에서 keyDown: 메시지 (및 관련 메시지 일 수도 있음)에 응답해야하며 해당보기는 메시지를 수신하는 첫 번째 응답자 여야합니다.

NSResponder class referenceCocoa Event-Handling Guide이 더 알려줍니다.

0

내가 한 일은 다음과 같습니다. 잘 작동합니다. (맥 OS 시에라에 대한 스위프트 3)

override func viewDidLoad() { 
    keyIsDown = false // variable defined in the NSViewController 

    NSEvent.addLocalMonitorForEvents(matching: .keyUp) { (aEvent) -> NSEvent? in 
     self.keyUp(with: aEvent) 
     return aEvent 
    } 

    NSEvent.addLocalMonitorForEvents(matching: .keyDown) { (aEvent) -> NSEvent? in 
     self.keyDown(with: aEvent) 
     return aEvent 
    } 
} 

은 지금은 이러한를 오버라이드 (override) :

override var acceptsFirstResponder: Bool { return true } 
override func becomeFirstResponder() -> Bool { return true } 
override func resignFirstResponder() -> Bool { return true } 

그리고 이들을 : 당신이 시작 얻어야한다

override func keyUp(with event: NSEvent) { 
    keyIsDown = false 
    if event.keyCode == 1 { 
     print("s key released") 
    } 
} 

override func keyDown(with event: NSEvent) { 
    if keyIsDown == true { 
     return 
    } 
    keyIsDown = true 
    // Whatever you'd like to do (check to see which key released, etc.) 
} 

합니다.