SwiftUI - 如何在 macOS 上将 onCommand 与 NSMenuItem 一起使用

Mar*_* T. 8 macos swift swiftui

我正在尝试找到在 macOS 上将 NSMenuItem 与 SwiftUI onCommand 连接的最佳解决方案。

目前我正在做以下事情:

  1. 在 AppDelegate 中,我创建了一个虚拟函数,以便能够列出函数 First Responder 接收到的操作列表。
@IBAction func changeColor(_ sender: Any) {
    print("Dummy Function")
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用 Main.storyboard 中的 First Responder 函数创建并连接一个 NSMenuItem。

  2. 将所需的代码添加到我的 SwiftUI 视图中

struct TestView: View {

    let changeColor = #selector(AppDelegate.changeColor(_:))

    var body: some View {
        VStack {
            TextField("Text", text: .constant(""))
            Text("Hello World!")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .onCommand(changeColor) {
            print("Change Color Action")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果 TextField 在我看到打印“更改颜色操作”之前是第一响应者。如果 TextField 之前不是第一响应者,则视图不会成为第一响应者。也许这目前是 Catalina Beta (19A558d) 中的一个错误,因为我也无法专注于工作。

小智 3

我已经能够通过首先创建视图来使其工作focusable

struct TestView: View {

    let changeColor = #selector(AppDelegate.changeColor(_:))

    var body: some View {
        VStack {
            TextField("Text", text: .constant(""))
            Text("Hello World!")
        }
        .frame(maxWidth: .infinity, maxHeight: .infinity)
        .focusable() // Add this 
        .onCommand(changeColor) {
            print("Change Color Action")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

那么您还必须选中“键盘系统偏好设置”中的“使用键盘导航在控件之间移动焦点”复选框

在此输入图像描述