로그인 화면들을 Navigation Controller에 담고 로그인이 성공하면 탭바 화면으로 넘어가도록 구현되어있다.
이 때, 다시 로그인이 하고 싶어져서 로그인 화면으로 갔다가 다시 로그인한다. 이러한 작업이 반복되면 뷰 컨틀롤러의 스택이 엄청나게 쌓이게 된다.
이러한 문제를 해결하기 위해 로그인 성공시 RootViewController를 TabBarController 로 변경하고자 한다.
@IBAction func confirmButtonDidTap(_ sender: UIButton) {
guard let tabBarController = UIStoryboard(name: Const.Storyboard.HomeTab, bundle: nil).instantiateViewController(withIdentifier: Const.ViewController.TabBarController) as? TabBarController else { return }
print(self.view.window?.rootViewController)
self.view.window?.rootViewController = tabBarController
self.view.window?.makeKeyAndVisible()
//tabBarController.modalPresentationStyle = .fullScreen
//present(tabBarController, animated: true, completion: nil)
}
로그인 완료하기 버튼을 클릭시 self.view.window?.rootViewController = tabBarController 를 통해 루트 뷰컨트롤러를 변경한다.
루트 뷰컨트롤러가 제대로 변경되는지 그 과정을 확인하기 위해 변경전 rootViewController를 출력한다.
class TabBarController: UITabBarController {
//MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
print(self)
print("DEBUG : \(self.view.window?.rootViewController)")
}
override func viewDidAppear(_ animated: Bool) {
print(self.view.window?.rootViewController)
}
}
루트 뷰컨틀롤러가 된 TabBarController에서 확인을 위해 rootViewController를 출력하고 본인이 맞는지 self를 출력해서 비교해본다.
이 때, 주의할 점이 있는데 바로 viewDidLoad와 viewDidAppear 두 곳에서 출력을 해보는 것이다.
self(tabBarController)와 변경된 루트 뷰컨트롤러를 비교해본 결과 루트 뷰컨틀로러가 정상적으로 변경되었다.
여기서 주목할만한 점은 viewDidLoad에서 rootViewController를 출력했을때는 nil이 출력된다는 것이다.
반면에 viewDidAppear에서 출력했을 때는 정상적으로 바뀐 rootViewcontroller가 출력된다.
따라서 rootViewController는 view가 Appear되고 적용된다고 추측 할 수 있다.
(관련하여 추가적인 공부가 필요하다.)