iOS/SwiftUI

[SwiftUI] @Environment(\.presentationMode) 사용해서 간편하게 View dismiss 하기

crazydeer 2024. 3. 11. 11:40
반응형

https://developer.apple.com/documentation/swiftui/presentationmode

 

PresentationMode | Apple Developer Documentation

An indication whether a view is currently presented by another view.

developer.apple.com

 

 

NavigationBar에 topLeading 위치에 toolbar로 뒤로가기 이미지를 추가한 후

버튼 이벤트를 간단히 추가하는 방법이 있습니다.

 

import SwiftUI

public struct SampleView: View {
  @State var title: String = "안녕하세유, 반가워유"
  @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

  public var body: some View {
    VStack {
      Text(title)
        .font(.system(size: 26, weight: .bold))
        .foregroundColor(.black)
        .padding()
      
      ...
      
      Spacer()
    }
    .navigationBarTitleDisplayMode(.inline)
    .navigationBarBackButtonHidden()
    .toolbar { toolbarContent() }
  }
  
  @ToolbarContentBuilder
  private func toolbarContent() -> some ToolbarContent {
    ToolbarItem(placement: .principal) {
      Text("Sample")
    }
    
    ToolbarItem(placement: .navigationBarLeading) {
      backButton
    }
    
    ToolbarItem(placement: .navigationBarTrailing) {
      actionButtons
    }
  }
  
  private var backButton: some View {
    Image(systemName: "chevron.backward")
      .padding(.horizontal, 8)
      .onTapGesture {
        self.presentationMode.wrappedValue.dismiss()
      }
  }
  
  private var actionButtons: some View {
    HStack(spacing: 0) {
      Image(systemName: "dot.radiowaves.left.and.right")
      Image(systemName: "heart.fill")
    }
  }
  
}

 

환경 변수(?)를 추가해줍니다.

@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

버튼 onTapGesture { }로 아래처럼 추가해줍니다.

self.presentationMode.wrappedValue.dismiss()

그러면 간단하게 Push했던 View를 Pop할 수 있습니다.

쉽죠? 끝~!

 

 

 

 

 
반응형