gpt4 book ai didi

macos - Swift - 从 NSViewController 捕获 keydown

转载 作者:行者123 更新时间:2023-11-30 12:19:57 29 4
gpt4 key购买 nike

我想在我的小应用程序中捕获按键事件。

我做了什么:

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 音效。

我见过很多帖子都在讨论这是一个属于 NSView 的委托(delegate),而 NSViewController 没有访问权限。但是 keydown 函数 override 自动在 NSViewController 类型的类中完成,这让我相信这是错误的。

最佳答案

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")
}
}
}
<小时/>

要消除按下字符键时发出的咕噜声,您需要对 View 进行子类化,请重写方法 PerformKeyEquivalent 并返回 true。

import Cocoa

class View: NSView {
override func performKeyEquivalent(with event: NSEvent) -> Bool {
return true
}
}

Sample Project

关于macos - Swift - 从 NSViewController 捕获 keydown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44915576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com