如何解决如何激活/停用 SwiftUI 中的菜单项
我正在尝试在适用于 mac os 的 SwiftUI 应用程序中创建自定义菜单项(SwiftUI 应用程序生命周期)。我不太明白以下行为:
在下面的代码中:
import SwiftUI
@main
struct MySQLtoolApp: App {
@ObservedObject var mysql = MySQL()
var flags = UtilFlags()
var selectedDB = "mysql"
var body: some Scene {
let mainWindow = WindowGroup(Text("title")) {
ContentView()
.environmentObject(mysql)
.environmentObject(flags)
}
.windowStyle(HiddenTitleBarWindowStyle())
.commands {
CommandMenu("Tools",content: {
Button("Connect...",action: {flags.connectDialogVisibilityFlag = true }).disabled(mysql.connected)
Button("Disconnect",action: { mysql.closeBase()
mysql.connected = false}).disabled(!mysql.connected)
})
CommandGroup(after: .help,addition: {
Button("Test button",action: {print("Test button pressed")})
.disabled(!mysql.connected)
})
}
return mainWindow
}
}
通过 CommandMenu 添加的按钮按预期运行(即根据 'mysql.connected' 的更改值激活和停用。通过 CommandGroup 添加的按钮在启动时根据 'mysql.connected' 的值正确配置,但是忽略 'mysql.connected' 的变化并且不改变它的状态。我错过了什么?
我重写了上面的部分来强调这个问题。简而言之:
import SwiftUI
@main
struct MenuTestApp: App {
@State var active = false
var body: some Scene {
WindowGroup {
ContentView()
}
.commands(content: {
CommandMenu("Tools",content: {
Button("Normally active",action: {active = !active}).disabled(active)
Button("Normally inactive",action: {active = !active}).disabled(!active)
})
CommandGroup(after: .newItem,addition: {
Button("Normally active",action: {active = !active}).disabled(!active)
})
})
}
}
通过 CommandMenu 添加的按钮行为正确(根据 'active' 的值激活和停用。通过 CommandGroup 添加的按钮忽略 'active' 的值并保持其初始状态。
解决方法
尝试使用 @StateObject
而不是 @ObservedObject
我在 Apple dev 中得到了一个很好的建议。论坛(感谢 OOPer!)。它可能无法解决根本原因(它是 SwiftUI 中的错误吗?),但它提供了一个很好的解决方法。如果我将我的“行为不端”按钮包装到一个视图中并添加它,一切都会按预期工作:
import SwiftUI
@main
struct MySQLtoolApp: App {
@StateObject var mysql = MySQL()
var flags = UtilFlags()
var selectedDB = "mysql"
var body: some Scene {
let mainWindow = WindowGroup(Text("title")) {
ContentView()
.environmentObject(mysql)
.environmentObject(flags)
}
.windowStyle(HiddenTitleBarWindowStyle())
.commands {
CommandMenu("Tools",content: {
Button("Connect...",action: {flags.connectDialogVisibilityFlag = true }).disabled(mysql.connected)
Button("Disconnect",action: { mysql.closeBase()
mysql.connected = false}).disabled(!mysql.connected)
})
CommandGroup(after: .newItem,addition: {
MyButtonsGroup().environmentObject(mysql)
})
}
return mainWindow
}
}
struct MyButtonsGroup: View {
@EnvironmentObject var mysql: MySQL
var body: some View {
Button("Test button",action: {print("Test button pressed")})
.disabled(mysql.connected)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。