개발 창고/iOS

[SwiftUI] How to Handle dimiss()

로이제로 2023. 12. 1. 22:00
반응형

오늘은 이렇게 dismiss 되어 돌아왔을 때 어떤 액션을 취하고 싶으면 어떻게 해야 하는지에 대해 이야기해 볼까 합니다.

 

1. ParentView (페이지 이동 전 View)

 현재 VIEW에서 다음 VIEW로 이동하기 위해서는 NavigationView나 NavigationStack을 이용해야 합니다.

// 부모 페이지
struct ParentView: View {
    @State var checked = false
    
    var body: some View {
        NavigationView {
            NavigationLink(destination:ChildView())
            {
                Text("페이지 이동 ==> ChildView")
            }
        }
    }
}

ChildView로 이동하는 링크를 갖는 ParentView

 

2. ChildView (페이지 이동 후 View)

이동된 페이지에서 dismiss를 하거나 상단의 Back 버튼을 클릭하여 다시 ParentView로 돌아가도록 구현합니다.

// 자식 페이지
struct ChildView: View {
    @Environment(\.dismiss) var dismiss
    
    var body: some View {
        Button(action:{ dismiss() }){
            Text("Close")
        }
    }
}

ParentView로 돌아가는 Close버튼을 갖는 ChildView

 

3. onDisappear

ParentView의 NavigationLink에서 destination에 오는 ChildView에

.onDisappear{ /* ACTION */ }

을 붙여주면, ChildView가 dismiss 될 때 해당 Action을 실행하게 됩니다.

// 부모 페이지
struct ParentView: View {
    @State var checked = false
    
    var body: some View {
        NavigationView {
            NavigationLink(destination:ChildView().onDisappear{ print("[onDisappear] ChildView가 닫혔습니다.") })
            {
                Text("페이지 이동 ==> ChildView")
            }
        }
    }
}

만약 위와 같이 ChildView()에 onDisappear를 붙여주고 내용을 콘솔 창에 출력하도록 Action을 주면 아래와 같이 콘솔창에 print 된 내용을 확인할 수 있습니다.

onDisappear가 실행된 결과화면

 

반응형