editMode 환경 변수

발행: (2026년 1월 31일 오후 11:55 GMT+9)
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 사용 MultiDatePicker는 SwiftUI에서 여러 날짜를 선택할 수 있게 합니다. Swift 초기화 메서드 MultiDatePicker.init(_:selection:in:) - titleKey: 레이블 키…

[SUI] 검색 바

NavigationStack의 검색 바 NavigationStack은 `searchable` 수식어를 사용하여 검색 바를 포함할 수 있습니다. 그 서명은 다음과 같습니다: ```swift searchable(...) ```