OSX中的KeyDown操作?

时间:2011-01-29 10:37:11

标签: objective-c cocoa macos keydown

我已经为我的keydown行动完成了所有代码,但我不知道如何处理第一个响应者,我去的每个站点似乎都在浏览。谁能告诉我如何设置它来识别cocoa objectivec中的keydown动作?

由于

2 个答案:

答案 0 :(得分:4)

首先,keyDown:是一条事件消息,而不是一条动作消息。请注意,它的参数是NSEvent,而不是某种UI对象(例如NSControl或NSMenuItem)。

动作消息沿着响应者链向下,在这种情况下,“第一响应者”并不特殊。每个响应者都会将其不知道如何处理的任何操作消息发送给下一个响应者。这是“响应者链”。第一响应者只是响应者在响应者链的头部 - 即,第一响应者。你只需要在那个链条中,在任何不知道如何响应传递给它的动作的背后。

但由于这是事件消息,因此情况有所不同。您需要成为关键视图which is the first responder

这就是它的全部内容。您需要在视图中响应keyDown:消息(以及可能相关的消息),并且该视图需要是接收消息的第一个响应者。

NSResponder class referenceCocoa Event-Handling Guide会告诉您更多信息。

答案 1 :(得分:0)

这是我所做的,而且效果很好。 (适用于macOS Sierra的Swift 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 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.)
}

这应该让你开始。