gpt4 book ai didi

swift - 将数据从简单的 NSView 传递到 SwiftUI View

转载 作者:行者123 更新时间:2023-12-04 01:26:32 27 4
gpt4 key购买 nike

我正在用 SwiftUI 制作一个 macOS 应用程序。我有一个符合 NSViewRepresentable 的结构,其目的是检测按下哪个键的键码。我想通过event.keyCode返回 SwiftUI 并将其保存到环境对象中,以便我可以在我的应用程序的其他地方使用关键代码。

我知道我应该使用 SwiftUI 协调器,但我能找到的所有教程和 Stack Overflow 问题都使用现成的类,例如 UIPageControlUISearchBar具有预先配置的代表。我不确定使用简单自定义时该怎么做 NSView .有人可以解释如何从 NSViewRepresentable 传递数据吗?结构到我的@EnvironmentObject使用自定义 NSView 时?

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 控制台,因此检测工作正常。

最佳答案

这是一个解决方案(带有一些复制的部分)。使用 Xcode 11.4/macOS 10.15.4 测试

class KeyboardInput: ObservableObject {
@Published var keyCode: UInt16 = 0
}

struct KeyboardEvent: NSViewRepresentable {
@Binding var keyStorage: UInt16 // << here !!
init(into storage: Binding<UInt16>) {
_keyStorage = storage
}

class KeyView: NSView {
var owner: KeyboardEvent? // << view holder

override var acceptsFirstResponder: Bool { true }
override func keyDown(with event: NSEvent) {
print("\(event.keyCode)")
owner?.keyStorage = event.keyCode
}
}

func makeNSView(context: Context) -> NSView {
let view = KeyView()
view.owner = self // << inject
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("Code: \(input.keyCode)")
KeyboardEvent(into: $input.keyCode) // << binding !!!
}
}
}

关于swift - 将数据从简单的 NSView 传递到 SwiftUI View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61832689/

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