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
更改。
解决方案是将您的菜单项包装在可以响应更改的视图中(通过 @State
或 ObservableObject
-- 我选择了后者)。
示例:
@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" )
}
}
}
我正在为我的 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
更改。
解决方案是将您的菜单项包装在可以响应更改的视图中(通过 @State
或 ObservableObject
-- 我选择了后者)。
示例:
@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" )
}
}
}