You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS SwiftUI项目onDeleteCommand菜单项始终启用如何解决

问题原因

macOS 12 Monterey Beta 5版本的SwiftUI存在已知缺陷,deleteDisabled修饰符的状态无法正确同步到系统顶部菜单栏的「删除」菜单项,即使列表无选中内容,系统也不会主动禁用对应菜单项。

解决方案

方案1:手动自定义删除命令(全版本兼容)

完全弃用系统自带的onDeleteCommand修饰符,通过自定义命令菜单手动控制删除功能的启用状态:

  1. 修改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: [])
            }
        }
    }
}
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:15:02