我正在使用SwiftUI开发macOS应用程序。我有一个遵循
我知道应该使用SwiftUI协调器,但我能找到的所有教程和Stack Overflow问题都使用预先配置了代理的现成类,例如
NSViewRepresentable
的结构体,其目的是检测按下的任何键的键码。我想将event.keyCode
传递回SwiftUI并将其保存到环境对象中,以便在应用程序的其他位置使用该键码。
我知道应该使用SwiftUI协调器,但我能找到的所有教程和Stack Overflow问题都使用预先配置了代理的现成类,例如
UIPageControl
或UISearchBar
。当使用简单的自定义NSView
时,我不确定该怎么做。有人能解释一下如何在使用自定义NSView
时将数据从NSViewRepresentable
结构传递到我的@EnvironmentObject
中吗?struct KeyboardEvent: NSViewRepresentable {
class KeyView: NSView {
override var acceptsFirstResponder: Bool { true }
override func keyDown(with event: NSEvent) {
print("\(event.keyCode)")
}
}
func makeNSView(context: Context) -> NSView {
let view = KeyView()
DispatchQueue.main.async {
view.window?.makeFirstResponder(view)
}
return view
}
func updateNSView(_ nsView: NSView, context: Context) {
}
}
struct ContentView: View {
@EnvironmentObject var input: KeyboardInput // save the keyCode here
var body: some View {
VStack {
Text(input.keyCode)
KeyboardEvent()
}
}
}
现在它通常将键码打印到Xcode控制台,所以检测工作正常。