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

时间:2019-09-22 12:08:45

标签: swift macos swiftui

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

当前我正在执行以下操作:

  1. 在AppDelegate中,我创建了一个虚拟函数,以便能够列出该函数“第一响应者”收到的动作列表。
@IBAction func changeColor(_ sender: Any) {
    print("Dummy Function")
}
  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")
        }
    }
}

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

2 个答案:

答案 0 :(得分:2)

我已经可以通过首先创建视图Eigen::Matrix3d?来使它起作用:

focusable

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

enter image description here

答案 1 :(得分:0)

我最终在AppDelegate中创建了一个PassthroughSubject,并将其传递到我的SwiftUI视图,并在我的SwiftUI视图所拥有的模型对象中进行了订阅。调用菜单命令的AppDelegate选择器时,我使用PassthroughSubject发送事件,我的模型接收并处理了该事件。

我的回答肯定不是理想的,我很想知道您是否找到了一种更好的方法。