오늘 프로젝트를 진행하다가 삽질을 엄청 하고 배운 내용을 남긴다.
(부디 저와 동일한 문제를 겪게된 분들은 삽질을 하지 않으시길 바랍니다.)
현재 프로젝트는 최대한 StoryBoard 사용을 지양하고 Programmatically 한 UI 개발을 지향 하고있다.
따라서, 코드로 모든 UI를 개발하는 도중 Navigation Controller
의 RootViewController
를 변경해야 할 일이 생겼다.
(어쩌면 이를 건들지 않고 해결할 수 있는 방법이 있을지도 모른다.)
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 |