본문 바로가기

iOS/SwiftUI

[SwiftUI] Menu 관련 버그

한 화면에 MenuModal View(.fullScreenCover, .sheet 등)를 같이 사용하는 경우, 해당 Modal Viewdismiss 되었을 때 Menu두번 탭해야 정상 작동하는 버그가 있습니다.

예제를 한번 볼까요?

 

VStack {
    Menu {
        Button {
            selectedMenu = 1
        } label: {
            Text("메뉴 1")
        }
        Button {
            selectedMenu = 2
        } label: {
            Text("메뉴 2")
        }
    } label: {
        Text("메뉴 버튼입니다")
    }

    Text("테스트 화면입니다")
        .onTagGesture {
            showModal = true
        }
}
.sheet(isPresented: $showModal, onDismiss: nil) {
    ModalView()
}

SwiftUIMenuContext Menu 라고 불리는 형태의 메뉴 목록을 화면에 보여줄 수 있습니다. (탭하면 해당 요소의 바로 아래 또는 위로 선택지가 나타나는 목록)

또, 위 예제처럼 .sheet를 사용하면 쉽게 Modal View를 나타낼 수 있습니다 (.fullScreenCover는 화면을 다 덮는 형태, .sheet는 일부만 덮는 형태)

문제는 이 두 가지를 한 화면에 같이 사용하면 발생하는 버그가 있다는 것이죠.

위 예제에서, 바로 "메뉴 버튼입니다"를 탭하면 메뉴가 보이지만, "테스트 화면입니다"를 탭하여 Modal View를 보여줬다가 Dismiss 시킨 후 다시 "메뉴 버튼입니다"를 탭하면 메뉴가 바로 보이지 않습니다. 두번 탭해야 보이는 버그가 있죠...

 

VStack {
    if !showModal {
        Menu {
            Button {
                selectedMenu = 1
            } label: {
                Text("메뉴 1")
            }
            Button {
                selectedMenu = 2
            } label: {
                Text("메뉴 2")
            }
        } label: {
            Text("메뉴 버튼입니다")
        }
    }

    Text("테스트 화면입니다")
        .onTagGesture {
            showModal = true
        }
}
.sheet(isPresented: $showModal, onDismiss: nil) {
    ModalView()
}

버그를 회피할 수 있는 방법은 있습니다. 위와 같이 Menu 자체를 화면에 다시 그리도록 하면 되더라구요.

이런 버그는 애플이 빨리 고쳐줬으면 좋겠습니다 ㅜㅜ