无法在 macOS14 上使用 SwiftUI 从菜单栏中选择子菜单

问题描述 投票:0回答:1

我正在尝试使用以下代码从我的菜单项之一添加子菜单:

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 移动到顶层,然后使用绑定。这完全一样。

我应该如何正确地做到这一点?

swiftui menubar macos-sonoma
1个回答
0
投票

这很奇怪!看来

.onChange
通话的位置就是罪魁祸首。

.onChange
(和
selected
状态变量)放在
Commands
结构之外(我建议放在 WindowGroup 上)应该可以解决此问题。

这是有道理的,因为您应用

.onChange
的视图可能不存在,直到您单击菜单栏中的“我的菜单”。那么它如何响应值的变化呢?

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.