如何通过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
相关产品推荐
相关产品推荐

