iOS

[SwiftUI] SwiftUI에서 탭바 숨기기 및 커스텀 백 버튼 만들기

GODOLs 2024. 6. 13. 15:39

SwiftUI iOS 16 버전에서 탭바를 숨기고 네비게이션 링크를 통해 이동한 후 커스텀 백 버튼을 사용해도 탭바가 사라지지 않도록 설정하는 방법을 알아보겠습니다.

문제 설명

탭바를 숨기기 위해 .toolbar(.hidden, for: .tabbar)를 사용하면 네비게이션 링크를 통해 이동한 후 커스텀 백 버튼을 눌러 뒤로 갈 때 부모 뷰에서 탭이 사라지는 문제가 발생할 수 있습니다.

해결 방법

이 문제를 해결하기 위해, 네비게이션 뷰 계층 구조와 상태 관리를 적절히 사용하여 탭바를 숨기고 복원하는 방법을 적용할 수 있습니다. 아래는 이를 구현하는 예제 코드입니다.

1. 기본 구조 설정

먼저 기본적인 탭바와 네비게이션 링크를 설정합니다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        TabView {
            NavigationView {
                ParentView()
                    .navigationTitle("Home")
            }
            .tabItem {
                Label("Home", systemImage: "house")
            }

            Text("Settings")
                .tabItem {
                    Label("Settings", systemImage: "gear")
                }
        }
    }
}

struct ParentView: View {
    var body: some View {
        NavigationLink(destination: ChildView()) {
            Text("Go to Detail")
        }
    }
}

2. 탭바 숨기기 및 커스텀 백 버튼 추가

'ChildView' 에서 탭바를 숨기고, 커스텀 백 버튼을 추가합니다.

가장 중요한 것은 tabBarVisible 이라는 상태관리를 통해서 Custom Back Button 을 눌렀을 경우 tabBarVisible을 true로 만들어 부모뷰의 TabView가 다시 활성 하게 만들어야합니다.

struct ChildView: View {
    @Environment(\.presentationMode) var presentationMode
    @State private var tabBarVisible: Bool = false

    var body: some View {
        VStack {
            HStack {
                Button(action: {
                    self.tabBarVisible = true
                    self.presentationMode.wrappedValue.dismiss()
                }) {
                    HStack {
                        Image(systemName: "chevron.left")
                        Text("Back")
                    }
                }
                .padding()

                Spacer()
            }
            .padding(.top, 10)

            Spacer()
            Text("Detail View")
            Spacer()
        }
        .navigationBarBackButtonHidden(true)
        .toolbar(tabBarVisible ? .visible : .hidden, for: .tabBar)
    }
}

이렇게 되면 하위 뷰에서 상위뷰로 돌아가더라도 탭뷰는 유지 될 것입니다.

반응형