editMode 환경 변수
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)으로 바인딩합니다. - 편집 모드 변화에 반응해야 하는 모든 자식 뷰에 바인딩을 전달하는 것을 잊지 마세요.