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

SwiftUI macOS列表选中项的键盘快捷键实现问题

macOS SwiftUI SwiftData 待办应用:为选中列表项添加键盘快捷键切换完成状态

问题描述

我正在开发一款用于练习的macOS待办事项应用,采用SwiftUI与SwiftData技术实现。视图中包含一个可选择的列表,遍历由SwiftData查询得到的[TaskModel]数组。我希望为选中项添加键盘快捷键以切换task.isCompleted状态,了解可使用.keyboardShortcut修饰符,但不清楚如何让快捷键仅对选中项生效。示例:选中Item B时,按下Cmd+C应触发该项的完成状态切换。

解决方案

核心思路是不在列表行上绑定快捷键(会导致所有行同时响应),而是在列表外层添加全局快捷键,通过选中状态判断是否触发操作。以下是修改后的完整代码:

import SwiftUI
import SwiftData

struct ContentView: View {
    @Environment(\.modelContext) var modelContext
    @Query private var tasks: [TaskModel]
    @State private var selections: Set<TaskModel> = []
    
    var body: some View {
        List(selection: $selections) {
            ForEach(tasks) { task in
                HStack {
                    Button("complete") {
                        task.isCompleted.toggle()
                    }
                    Text(task.name)
                }
            }
        }
        // 添加全局快捷键,仅当有选中项时生效
        .toolbar {
            ToolbarItem(placement: .keyboard) {
                Button(action: toggleSelectedTasksCompletion) {
                    EmptyView()
                }
                .keyboardShortcut("c", modifiers: .command)
                .disabled(selections.isEmpty)
            }
        }
    }
    
    private func toggleSelectedTasksCompletion() {
        // 方案1:批量切换所有选中项的完成状态
        for task in selections {
            task.isCompleted.toggle()
        }
        
        // 方案2:仅切换第一个选中项的状态(适用于单选场景)
        // if let firstTask = selections.first {
        //     firstTask.isCompleted.toggle()
        // }
    }
}

@Model
class TaskModel: Identifiable {
    var id: UUID
    var name: String
    var isCompleted: Bool
    
    init(id: UUID = UUID(), name: String, isCompleted: Bool = false) {
        self.id = id
        self.name = name
        self.isCompleted = isCompleted
    }
}

关键说明

  1. 快捷键绑定方式:使用ToolbarItem(placement: .keyboard)添加隐藏按钮,绑定Cmd+C快捷键。这种方式的快捷键会全局响应,但通过.disabled(selections.isEmpty)确保只有存在选中项时才可用。
  2. 选中项处理逻辑:toggleSelectedTasksCompletion函数支持两种模式——批量切换所有选中项,或仅切换第一个选中项,可根据需求选择。
  3. 模型优化:给TaskModel添加Identifiable协议,简化ForEach的使用;为初始化参数添加默认值,降低模型创建的复杂度。

内容的提问来源于stack exchange,提问作者dev_dev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 08:52:13