본문 바로가기

iOS

[iOS] NavigationController RootView 변경

오늘 프로젝트를 진행하다가 삽질을 엄청 하고 배운 내용을 남긴다.

(부디 저와 동일한 문제를 겪게된 분들은 삽질을 하지 않으시길 바랍니다.)

현재 프로젝트는 최대한 StoryBoard 사용을 지양하고 Programmatically 한 UI 개발을 지향 하고있다.

따라서, 코드로 모든 UI를 개발하는 도중 Navigation ControllerRootViewController를 변경해야 할 일이 생겼다.

(어쩌면 이를 건들지 않고 해결할 수 있는 방법이 있을지도 모른다.)

modal 뷰를 이용하여 임시방편으로 사용할지 많은 고민을 했으나 아무리 생각해도 Navigation Controller로 이어지는 것이 더욱 UX 측면에서 옳다고 생각했다..

생각을 행동으로 옮긴 결과 약 한시간 동안 열심히 삽질을 진행했다.

iOS13 버전에서는 deprecated 되어버린 솔루션이 많아서 생각보다 삽질이 길어졌다.

핵심은 sceneDelegate였다.

바로 코드부터 살펴본다.

let rootVC = replaceRootViewController()
    let sceneDelegate = UIApplication.shared.connectedScenes.first?.delegate as! SceneDelegate
    sceneDelegate.window?.rootViewController = rootVC


루트뷰로 대체하고자 할 뷰컨트롤러의 인스턴스를 생성하고 SceneDelegate를 생성한다.

UIApplication 클래스는 iOS에서 실행되는 앱의 중앙 집중 제어 및 조정을 진행한다.

또한 싱글톤 생성 패턴을 이용하여 shared 인스턴스를 사용한다.

connectedScenes 변수는 앱이 현재 연결된 장면을 관리한다.

이를 통해 delegate를 초기화한다.

SceneDelegate를 생성하는 이유는 iOS13부터 SceneDelegate로 옮겨진 window 프로퍼티에 접근하기 위함이다!

이후 평소에 작업하던것 처럼 rootViewController를 지정해준다!

'iOS' 카테고리의 다른 글

[iOS] Unit Test  (0) 2020.05.29
[iOS] UIResponder  (0) 2020.05.29
[iOS] Completion Handler  (0) 2020.05.25
[iOS] Firebase  (0) 2020.05.24
[iOS] Dive in Closure  (0) 2020.05.24