macOS SwiftUI项目onDeleteCommand菜单项始终启用如何解决
问题原因
macOS 12 Monterey Beta 5版本的SwiftUI存在已知缺陷,deleteDisabled修饰符的状态无法正确同步到系统顶部菜单栏的「删除」菜单项,即使列表无选中内容,系统也不会主动禁用对应菜单项。
解决方案
方案1:手动自定义删除命令(全版本兼容)
完全弃用系统自带的onDeleteCommand修饰符,通过自定义命令菜单手动控制删除功能的启用状态:
- 修改App入口结构体,替换默认的删除菜单项:
@main struct DeleteDemoApp: App { @State var selection: Set<String> = [] @State var data = ["Item1", "Item2", "Item3"] var body: some Scene { WindowGroup { ContentView(data: $data, selection: $selection) } .commands { CommandGroup(replacing: .pasteboard) { Button("删除") { data.removeAll(where: selection.contains) selection.removeAll() } .disabled(selection.isEmpty) .keyboardShortcut(.delete, modifiers: []) } } } }
- 调整ContentView代码,移除失效的修饰符:
struct ContentView: View { @Binding var data: [String] @Binding var selection: Set<String> var body: some View { NavigationView { List(data, id: \.self, selection: $selection) { item in Text(item) } Text("Second Panel") } } }
该方案可以在Beta测试版和后续正式版中正常运行,删除菜单项的禁用状态会和列表选中状态完全同步。
方案2:升级到正式版本
升级到macOS Monterey 12.0正式版 + Xcode 13.0正式版后,原生deleteDisabled修饰符的同步bug已被官方修复,原有代码无需修改即可正常生效。
内容的提问来源于stack exchange,提问作者recaptcha
相关产品推荐
相关产品推荐

