[SwiftUI] TabView, NavigationView 이용하기

Page·2022년 8월 4일
0

SwiftUI

목록 보기
16/18

서론

현재 진행중인 프로젝트에서 View를 탐색(Navigate) 할 때마다 일관적으로 Tab bar가 사라지는게 아니라 어느 때는 보이고, 어느 때는 안 보여야했다. 그런데 현재 탭뷰와 네비게이션 뷰를 이용하는데는 아직 많은 문제점이 많은 것 같고 과연 좋은 솔루션인지는 모르겠지만 어쨋든 해결을 했다. 그 과정을 써볼 것이다.

네비게이션 뷰와 탭 뷰를 함께 사용하는 형식은 2가지가 있다.
1. 탭뷰 내부에 네비게이션 뷰 이용하기
2. 네비게이션 뷰 내부에 탭뷰 이용하기

1번 이슈와 솔루션

1번의 문제점은 화면 전환 시 탭바가 사라지지 않는다는 것이다. 이걸 해결하기 위해 구글링해보면 2번처럼 이용하라는 답을 많이 얻게된다. 그래서 나도 2번처럼 이용했다.

2번 이슈와 솔루션

탭바가 사라지는건 정상적으로 되는데, Navigation Bar가 Hidden되지 않는 문제가 생긴다. 엄청 시간을 들여서 찾은 솔루션은, 각 Tab이 Appear될 때마다 navigation title을 변경해주는 것이다. 원인은 모르겠지만 이렇게 하면 정상적으로 Navigation bar가 사라진다.

struct Posting: View {
    
    @State private var title = ""
    var body: some View {
        NavigationView {
            TabView {
                Text("...")
                    .onAppear {
                        title = ""
                    }
            }
            .navigationTitle(title)
            .navigationBarHidden(true )
        }
    }
}

그런데 만약 네비게이션 링크를 먼저 타고 그 안에서 위처럼 작성한다면 이건 해결할 방법이 없는것 같다.

탭 전환까지

일반적인 경우에는 2번의 솔루션으로 해결이 가능할거 같은데, 나는 A탭에서 B탭으로의 전환하도록 구현해야했다.

그런데 각 화면마다 탭바가 보여야 할 때(내부 네비게이션)가 있었고 아닐 때(외부 네비게이션)가 있었다. 그래서 네비게이션 뷰를 탭뷰의 외부와 내부에 각각 사용해줬다.

더 디테일하게는 A탭의 내부 네비게이션 뷰에서 버튼을 클릭하면 B탭의 외부 네비게이션으로 이동해야한다. 그런데 B탭의 외부 네비게이션을 이용하면 A탭 내부 네비게이션 뷰가 종료된다.

결국에는 내부 네비게이션만 이용하고 탭바를 필요할 때마다 숨기는 방식으로 구현해야됐고 딱 맞는 라이브러리를 찾았다.

HidableTabView

이걸 이용해서 필요할 때마다 쉽게 탭바를 숨기고, 보여줄 수 있다. NavigationBar 이슈까지 해결이 되기때문에 앞으로는 계속 이걸 이용하려고한다.

iOS 16 버전부터 이용 가능한 NavigationStack에는 이런 문제가 해결되었길 바란다.

0개의 댓글