iOS/SwiftUI

SwiftUI `.fullScreenCover` `enum` 활용해 화면 전환

Brad_Heo 2023. 11. 13. 18:44

화면 전환을 하는 버튼이 여러개가 있을 떄, 계속 예상치 못한 화면으로 전환되어 정리하는 겸 기록해보자..

먼저 fullScreenCover에 대해 알아보자.

스크린샷 2023-11-13 오후 6 14 27

가능한 한 많은 화면을 표현하는 modal 보기라고 설명되어 있는데, 보여줄 컨텐츠가 연관되어 있는 것이 아닌 새로운 컨텐츠일떄 사용할떄 많이 사용하지 않을까 싶다.

사용법은 간단하다.

struct ContentView: View {
    @State private var isButtonTap = false

    var body: some View {
        VStack {
            Button {
                isButtonTap.toggle()
            } label: {
                Text("화면 전환!")
            }
        }
        .fullScreenCover(isPresented: $isButtonTap) {
            Text("화면 전환 완료")
        }
    }
}

isPresented 에 바인딩 Bool 값을 변환시켜주게되면, 아래 영상처럼 화면전환이 된다.

Nov-13-2023 18-19-51

이제 버튼이 여러개 있을 경우 각각의 맞는 화면을 전환해보자.

enum ButtonCase: CaseIterable, Identifiable {
    case a
    case b
    case c

    var id: String {
        switch self {
        case .a:
            return "화면 전환 A"
        case .b:
            return "화면 전환 B"
        case .c:
            return "화면 전환 C"
        }
    }
}

struct ContentView: View {    
    @State private var buttonCase: ButtonCase? = nil

    var body: some View {
        VStack {
            ForEach(ButtonCase.allCases, id: \.self) { button in
                Button {
                    buttonCase = button
                } label: {
                    Text(button.id)
                }
            }
        }
        .fullScreenCover(item: $buttonCase) { button in
            switch button {
            case .a:
                Text("화면 전환 완료 A")
            case .b:
                Text("화면 전환 완료 B")
            case .c:
                Text("화면 전환 완료 C")
            }
        }
    }}

코드부터 보게되면, enum 타입으로 버튼케이스에 대해서 정리를 해두고, View에서 Button 클릭 시 해당 타입을 주입시켜주고 있다.

여기서 다른 점이 fullScreenCover 파라미터 사용하는 것이 앞에 것과 다르다. 여기선 item을 사용했는데, isPresent를 사용하게 되면 처음 클릭 시 원하는 화면이 안나오게 되는 버그? 현상이 있는데...

print를 통해 디버깅을 해보아도, 타입은 변경이 되었지만, 화면 전환 시 예상치 못한 화면이 나오게 된다.

Nov-13-2023 18-33-49

참고자료.. 제 상황과 매우 비슷해서, 도움이 많이 되었습니다.

https://stackoverflow.com/questions/66162219/swiftui-switch-sheet-on-enum-does-not-work