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

如何通过ContextMenu切换TextView的编辑启用/禁用状态?

可以实现这个需求,具体修改步骤如下:

1. 更新Passion模型,添加编辑状态属性

给每个Passion实例增加独立的编辑状态标识,用于控制单行TextField的可编辑权限:

struct Passion: Identifiable {
    let id = UUID()
    var title: String
    var isEditing = false // 新增属性,标记当前项是否处于编辑状态
}

2. 修改PassionRowView,动态控制TextField禁用状态

把固定的.disabled(true)改成根据passion.isEditing状态动态切换:

struct PassionRowView: View {
    @Binding var passion: Passion
    
    var body: some View {
        TextField("", text: $passion.title)
            .disabled(!passion.isEditing) // 根据isEditing状态控制是否禁用
    }
}

3. 给列表行添加ContextMenu并实现状态切换逻辑

将ContextMenu绑定到每个列表行,点击按钮时切换对应Passion实例的编辑状态:

struct PassionListView: View {
    @EnvironmentObject var model: PassionsModel
    
    var body: some View {
        List {
            ForEach($model.passions) { $passion in
                PassionRowView(passion: $passion)
                    .contextMenu {
                        Button(action: {
                            passion.isEditing.toggle() // 切换当前行的编辑状态
                        }) {
                            // 根据当前状态显示不同的按钮文案和图标
                            Label(passion.isEditing ? "禁用编辑" : "启用编辑", 
                                  systemImage: passion.isEditing ? "lock" : "pencil")
                        }
                    }
            }
            .onDelete(perform: model.delete)
        }
        .navigationTitle("My Passions")
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                Button(action: model.add) {
                    Label("Add Item", systemImage: "plus")
                }
            }
        }
        .animation(.default, value: model.passions)
        .listStyle(.sidebar)
    }
}

核心逻辑说明

  • 每个Passion实例的isEditing属性独立管理自身行的编辑权限,避免行与行之间的状态干扰
  • 通过绑定直接修改对应实例的状态,能实时同步到TextField的禁用状态,无需额外的状态传递
  • 按钮的文案和图标会随当前状态动态变化,让操作意图更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 14:23:18