macOS 菜单项未调用 SwiftUI Toggle onChange

SwiftUI Toggle onChange not called for macOS menu item

我正在为我的 macOS SwiftUI 应用程序添加一个排序菜单。有些项目旁边可以有复选标记。对于每个菜单项,我创建一个绑定到 @State Bool 的切换项。单击某个项目时,我想 运行 附加代码来更新排序,因此我添加了一个 .onChange,但它从未被调用。项目的复选标记如我所料出现和消失,但 .onChange 永远不会被击中。

这里是创建带有复选标记的 macOS 菜单项的示例。 “更改”永远不会被打印出来,那里设置的断点也永远不会被击中。

import SwiftUI

struct ViewMenuCommands: Commands {
    @State
    var isAlphabetical = false
        
    @CommandsBuilder var body: some Commands {
        CommandMenu("ViewTest") {
            Toggle("Alphabetical", isOn: $isAlphabetical)
                .onChange(of: isAlphabetical) { value in
                    print( "change" )
                }
        }
    }
}

这里是我将菜单添加到应用程序的地方:

import SwiftUI

@main
struct MenuToggleTestApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            ViewMenuCommands()
        }
    }
}

问题是 @State 没有通知 Commands 其更改的结果 -- @State 只会通知 View 更改。

解决方案是将您的菜单项包装在可以响应更改的视图中(通过 @StateObservableObject -- 我选择了后者)。

示例:

@main
struct MainApp: App {
    @StateObject var menuState = MenuState()
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
        .commands {
            CommandMenu("ViewTest") {
                AlphabeticalMenuItem(menuState: menuState)
            }
        }
    }
}

class MenuState : ObservableObject {
    @Published var isAlphabetical = false
}

struct AlphabeticalMenuItem : View {
    @ObservedObject var menuState : MenuState
    
    var body: some View {
        Toggle("Alphabetical", isOn: $menuState.isAlphabetical)
            .onChange(of: menuState.isAlphabetical) { value in
                print( "change" )
            }
    }
}