editMode 环境变量

发布: (2026年1月31日 GMT+8 22:55)
3 min read
原文: Dev.to

Source: Dev.to

概览

@Environment(\.editMode) 提供的是 绑定 到编辑模式状态,而不是普通的值。
当与 ListEditButton() 一起使用时,SwiftUI 会在内部提供该绑定,所以你很少会看到显式的声明。

默认行为

  • EditButton() 切换 editMode 环境变量。
  • List 监听此变化,切换到编辑模式,将按钮标题从 Edit 改为 Done,并显示删除行的 UI。
  • 即使在你的视图中没有声明 editMode,它仍然是唯一的真相来源。

手动控制

如果需要自行控制编辑模式,声明自己的状态变量并将其绑定到环境中。

状态声明

@State private var editMode: EditMode = .inactive

EditMode 有三种情况:.inactive.active.transient

注入绑定

使用 .environment(\.editMode, $editMode) 修饰符将你的状态注入 SwiftUI 的环境中,既适用于父视图,也适用于任何子视图。

父视图示例

NavigationStack {
    VStack(spacing: 16) {
        if editMode == .active {
            Text("I appear only in Edit Mode")
                .padding()
                .background(.yellow)
        }

        Text("Always visible")
        EditButton()               // toggles SwiftUI’s editMode env var
        Button("tap me for second view") {
            isShowing.toggle()
        }
    }
    .environment(\.editMode, $editMode)          // bind our state to the env var
    .fullScreenCover(isPresented: $isShowing) {
        SecondContentView()
            .environment(\.editMode, $editMode)  // pass the binding to the child
    }
}

子视图示例

struct SecondContentView: View {
    @Environment(\.editMode) var editMode   // binding from the environment

    var body: some View {
        NavigationStack {
            VStack(spacing: 16) {
                if editMode?.wrappedValue.isEditing == true {
                    Text("I appear only in Edit Mode")
                        .padding()
                        .background(.yellow)
                }
            }
        }
    }
}
  • editMode?.wrappedValue.isEditing 检查环境提供的实际编辑模式状态。
  • 子视图收到相同的绑定,因此在父视图中切换编辑模式会自动更新子视图。

要点

  • @Environment(\.editMode)绑定,而不是静态值。
  • SwiftUI 会自动为 List/EditButton() 提供该绑定。
  • 若要手动控制,声明一个 EditMode 类型的 @State 变量,并使用 .environment(\.editMode, $editMode) 进行绑定。
  • 记得将绑定传播给所有需要响应编辑模式变化的子视图。
Back to Blog

相关文章

阅读更多 »

[SUI] 多日期选择器

使用 MultiDatePicker。MultiDatePicker 允许在 SwiftUI 中选择多个日期。Swift 初始化器 MultiDatePicker.init_:selection:in: - titleKey: 标题键。

[SUI] 搜索栏

NavigationStack 中的搜索栏 NavigationStack 可以通过 `searchable` 修饰符添加搜索栏。它的签名是:swift searchable t...

2026 年如何构建 SwiftUI 项目

问题 Xcode 只给你 ContentView.swift,仅此而已。随着你的应用增长,你会出现以下情况:- 一个文件夹里有 50 个文件 - ViewModel 与 View 混在一起 - 没有 cl...