SwiftUI macOS中如何阻止Menu内的Picker被自动折叠为子菜单
问题原因
macOS 平台的 SwiftUI 对 Menu 内的 Picker 有默认适配逻辑,会自动将 Picker 的所有选项折叠为子菜单,属于系统默认行为。另外你当前代码中 Picker 内部嵌套 Button 属于错误用法,Picker 选项只需提供 Text 搭配 tag 即可,无需额外添加 Button,选择事件会自动绑定到 selection 变量。
解决方案1:指定 Picker 样式(推荐,适配 macOS 13+)
给 Picker 添加 .pickerStyle(.inline) 修饰符即可阻止系统自动折叠,直接将选项平铺在当前菜单中:
Menu("Budgets") { Picker("Budgets", selection: $account) { Text("Personal").tag(1) Text("Business").tag(2) } .labelsHidden() .pickerStyle(.inline) // 关键修饰符,禁止折叠为子菜单 Divider() Button("New Budget…") {} Button("Manage Budgets…") {} }
解决方案2:手动实现单选逻辑(兼容 macOS 12 及更低版本)
如果需要兼容旧版本系统,可以放弃使用 Picker,手动实现带勾选状态的单选按钮,完全自定义显示逻辑,不会触发系统自动折叠:
Menu("Budgets") { // 手动实现单选选项 Button { account = 1 } label: { if account == 1 { Label("Personal", systemImage: "checkmark") } else { Text("Personal") } } Button { account = 2 } label: { if account == 2 { Label("Business", systemImage: "checkmark") } else { Text("Business") } } Divider() Button("New Budget…") {} Button("Manage Budgets…") {} }
内容的提问来源于stack exchange,提问作者Roman Banks
相关产品推荐
相关产品推荐

