我想在我的小应用程序中捕获关键事件。
我做了什么:
class ViewController : NSViewController { ... override func keyDown(theEvent: NSEvent) { if theEvent.keyCode == 124 { println("abc") } else { println("abcd") } } override var acceptsFirstResponder: Bool { return true } override func becomeFirstResponder() -> Bool { return true } override func resignFirstResponder() -> Bool { return true } ... }
怎么了:
按下键时,会播放Funk声音效果。
Funk
我看过很多帖子,都在谈论这是如何属于NSView和NSViewController没有访问权限的委托。但是keydown函数override自动完成的类类型使NSViewController我相信这是错误的。
NSView
NSViewController
keydown
override
Xcode 8.2.1•Swift 3.0.2
import Cocoa class ViewController: NSViewController { @IBOutlet var textField: NSTextField! override func viewDidLoad() { super.viewDidLoad() NSEvent.addLocalMonitorForEvents(matching: .flagsChanged) { self.flagsChanged(with: $0) return $0 } NSEvent.addLocalMonitorForEvents(matching: .keyDown) { self.keyDown(with: $0) return $0 } } override func keyDown(with event: NSEvent) { switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) { case [.command] where event.characters == "l", [.command, .shift] where event.characters == "l": print("command-l or command-shift-l") default: break } textField.stringValue = "key = " + (event.charactersIgnoringModifiers ?? "") textField.stringValue += "\ncharacter = " + (event.characters ?? "") } override func flagsChanged(with event: NSEvent) { switch event.modifierFlags.intersection(.deviceIndependentFlagsMask) { case [.shift]: print("shift key is pressed") case [.control]: print("control key is pressed") case [.option] : print("option key is pressed") case [.command]: print("Command key is pressed") case [.control, .shift]: print("control-shift keys are pressed") case [.option, .shift]: print("option-shift keys are pressed") case [.command, .shift]: print("command-shift keys are pressed") case [.control, .option]: print("control-option keys are pressed") case [.control, .command]: print("control-command keys are pressed") case [.option, .command]: print("option-command keys are pressed") case [.shift, .control, .option]: print("shift-control-option keys are pressed") case [.shift, .control, .command]: print("shift-control-command keys are pressed") case [.control, .option, .command]: print("control-option-command keys are pressed") case [.shift, .command, .option]: print("shift-command-option keys are pressed") case [.shift, .control, .option, .command]: print("shift-control-option-command keys are pressed") default: print("no modifier keys are pressed") } } }
要消除按字符键时发出的刺耳的声音,您需要对视图进行子类化,重写方法performKeyEquivalent并返回true。
import Cocoa class View: NSView { override func performKeyEquivalent(with event: NSEvent) -> Bool { return true } }
样例项目