我正在尝试使用以下代码从我的菜单项之一添加子菜单:
import SwiftUI
@main
struct MenuAppApp: App
{
var body: some Scene
{
WindowGroup
{
ContentView()
}
.commands
{
MyMenu()
}
}
}
struct MyMenu: Commands
{
let array = ["Submenu 1", "Submenu 2", "Submenu 3"]
@State var selected = "Submenu 1"
var body: some Commands
{
CommandMenu("My Menu")
{
Button("First Thing")
{
print ("First Thing")
}
Divider()
Picker(selection: $selected, label: Text("Second Thing"))
{
ForEach (Array(array.enumerated()), id: \.element)
{ index, item in
Text(item).tag(item)
// Button(item)
// {
// print("Button \(item) selected")
// }
}
}
.onChange(of: selected)
{
print ("OnChange \(selected)")
}
}
}
}
struct ContentView: View
{
var body: some View
{
VStack
{
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
}
.padding()
}
}
这会正确呈现菜单,但直到第二次选择菜单后才会执行菜单的 onChange 部分。
选择第二件事 → 子菜单 2 什么都没发生 单击菜单栏上的任意位置一次 然后它会打印“On Change Submenu 2”
在执行操作之前,您必须重新选择菜单栏中的任何菜单。
如果我取消注释按钮代码,则按钮操作永远不会被执行。
我还尝试将选定的 State var 移动到顶层,然后使用绑定。这完全一样。
我应该如何正确地做到这一点?
这很奇怪!看来
.onChange
通话的位置就是罪魁祸首。
将
.onChange
(和 selected
状态变量)放在 Commands
结构之外(我建议放在 WindowGroup 上)应该可以解决此问题。
这是有道理的,因为您应用
.onChange
的视图可能不存在,直到您单击菜单栏中的“我的菜单”。那么它如何响应值的变化呢?
希望有帮助!