iOS 14.5 NavigationLink의 Unable to present 오류 해결하기

안녕하세요. 오늘은 SwiftUINavigationLink를 사용할 때 생기는 Unable to present. Please file a bug 오류를 해결한 과정을 글로 작성했습니다.

bg

문제 상황

요즘 저는 SwiftUI로 아이패드 전용 어플리케이션을 만들고 있는데요, 얼마 전부터 메인 화면의 사이드 메뉴가 눌러지지 않는다는 리뷰가 들어오기 시작했고, 시뮬레이터에서 돌려본 결과 정말 그런 문제가 재현되었습니다.

잘되던 메뉴가 갑자기 안되다니 이게 무슨 귀신이 곡할 노릇일까요?

안되는 경우 잘되는 경우
image image

문제 정의하기

메인 화면엔 주요 메뉴와 보조 메뉴가 총 9개 있고, 프로필 및 로그인 관련 코드도 여기 다 붙어있기 때문에, 먼저 무슨 문제 때문에 이런 현상이 일어나는 것인지 알아내는 것이 우선이었습니다.

야속하게도 콘솔엔 Unable to present. Please file a bug.라는 에러 로그만 찍히고 다른 힌트는 없었습니다.

주요 메뉴를 제외한 나머지 코드를 모두 제거해도 오류는 계속 발생했기 때문에, 문제는 주요 메뉴에 있을 거라 생각했습니다.

그렇다면 최근에 추가한 메뉴들 때문에 생기는 오류는 아닐까요? 그래서 메뉴를 줄여봤지만, 문제는 그대로 발생했습니다.

image

메뉴를 더 줄여봤더니 다행히도 2개에선 잘 되는 것을 확인했습니다!

image

여전히 이유는 모르겠지만 메뉴(NavigationLink)가 3개 이상일 때 메뉴 이동이 되지 않는다 라는 문제를 알았습니다.

문제 해결하기

메뉴는 추가가 되어도 틀이 바뀐 적은 없었는데 갑자기 이런 일이 생겼습니다. 무슨 일이 생긴 걸까요?

관련 로직에만 집중할 수 있게 간소화한 코드를 준비했습니다.

지금 와서 생각하면 2개일 때 잘 되는데 3개부턴 안된다는 건 공유해서 사용하고 있는 상태를 의심했어야 하는데 멍청한 저는 하루를 꼬박 구글링했습니다..

그렇게 이틀째가 돼서야 깨달은 저는 각 메뉴의 상태를 분리해줬습니다.

그럼 한 번 돌려볼까요?

image

제대로 작동하네요!

글로 적은 과정은 짧았지만, 이틀 동안 정말 눈감고 벽을 짚으며 미로를 빠져나가는 기분이었습니다…

문제 원인 찾기

왜 이런 문제가 발생했을까요?

구글링하면서 찾은 내용이 몇 가지 있습니다.

iOS 14.5가 되면서 NavigationLink 문제가 꽤 있었나 봅니다. NavigationLink unable to present 라고만 쳐도 정말 많은 결과가 나왔습니다.

대표적인 해결책으론 NavigationLink 하나당 빈 NavigationLink를 추가하는 방법이 있었습니다. 링크

하지만 이 방식은 제 상황엔 통하지 않았고 코드만 훑어보면서 해결해보려고 했지만 실패해서 하나씩 다 읽어보기로 했습니다.

제 상황을 해결할 수 있는 가장 큰 실마리가 된 내용은 이 스레드입니다.

jojost1님이 말한 내용은 저와 동일한 증상이었고, Jon_Shier님의 답변은 저에게 힌트를 주었습니다. 저도 완벽하게 이해한 것은 아니고 동일한 로컬 상태를 공유하는 네비게이션 링크 간 이동이 공유된 상태를 초기화시켜버린다는 것 같습니다.

이 부분에서 힌트를 얻어서 위에서 해결했던 방식대로 수정해봤고 결국엔 해결했습니다.

이 버그는 iOS 14.5에서 시작해서 14.6에서도 계속되고 있는 것 같습니다.

그리고 단순히 SideMenu?Bool 다섯 개로 바꾼다고 문제가 해결되지도 않습니다. ViewModel 같은 거로 바깥으로 빼줘야 메뉴 이동이 잘됩니다. 근본적인 이유는 아직도 잘 모르겠습니다..

마치며

아직 SwiftUI와 친해지고 있는 단계라 이게 SwiftUI 버그인지 저의 잘못된 사용으로 인해 생긴 문제인지 모르겠지만, 앞으로는 SwiftUI가 더 많이 발전해서 어떻게 만들지 보단 무엇을 만들지에 집중하는, 말 그대로 선언적인 개발을 하고 싶습니다.

해결하는 방식도 스마트하지 못하고 이유도 명확하게 밝혀낸 것은 아니지만 제 글을 통해 누군가는 저처럼 고통받지 마시고 사용자에게 더 좋은 경험을 제공할 수 있는 시간을 더 가질 수 있었으면 좋겠습니다.

읽어주셔서 감사합니다. 다음엔 더 유익한 내용으로 찾아뵙겠습니다.