状況
osX(macOS)向けアプリ開発でキーボード入力を受け付ける際、keyDown()
などを用いると思います。
sample1.swift
import Cocoa
class ViewController: NSViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override var representedObject: Any? {
didSet {
}
}
override var acceptsFirstResponder: Bool {
return true
}
override func keyDown(with event: NSEvent) {
Swift.print(event.keyCode)
}
}
今まではこんな感じでNSViewController
のサブクラスでkeyDown()
を実装すればよかったのですが、なぜか最近作ったプロジェクトだとBeep音が鳴るようになってしまいました。
とりあえずの解決策
Beep音を鳴らさないためには、NSView
のサブクラスでkeyDown()
を実装すれば良いようです。
sample2.swift
class MyView: NSView {
override func keyDown(with event: NSEvent) {
Swift.print(event.keyCode)
}
}
ぼやき
なぜNSViewController
のサブクラスで実装するとダメなのか、わからないのですが、解決策を知っている方いましたら教えていただきたいです。
追記:解決策
テキストボックスやテキストエリアではないところにフォーカスが当たっている状態でのキー入力をする際、そのフォーカスが当たっているオブジェクトでacceptsFirstResponder
をtrueにしないとBeep音がなってしまうようです.
なので、Beep音を鳴らさないためには、フォーカスをコントロールするか、デフォルトでフォーカスが当たるオブジェクトで
override var acceptsFirstResponder: Bool {
return true
}
と記述しておけばいいようです。