editMode 环境变量
发布: (2026年1月31日 GMT+8 22:55)
3 min read
原文: Dev.to
Source: Dev.to
概览
@Environment(\.editMode) 提供的是 绑定 到编辑模式状态,而不是普通的值。
当与 List 和 EditButton() 一起使用时,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)进行绑定。 - 记得将绑定传播给所有需要响应编辑模式变化的子视图。