본문 바로가기

iOS

[iOS] iOS13 이후 버전에서의 Navigation Controller 설정

기존에 구현한 회원가입 절차를 Navigation Controller를 이용해 재구현하였다.

위 구현과정에서 많은 삽질이 있었다...

정답은 SceneDelegate.swift 내에 있는 didFinishLaunchingWithOptions였다.

iOS13 이전의 버전은 기존과 같이 AppDelegate에 있는 didFinishLaunching 에서 아래와 같이 처리해주면 된다.

/ // AppDelegate.swift // 
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch.
 if #available(iOS 13, *) {
    print("set in SceneDelegate") }
    else {
       let window = UIWindow(frame: UIScreen.main.bounds)
       window.rootViewController = RootTabBarViewController()
       self.window = window window.makeKeyAndVisible() 
    }
     return true 
     }

처음 시도하다보니 위 내용이 맞는줄 알고 AppDelegate만 수정하고 왜 안되는지 몰라서 계속하여 삽질을 했다.

결론적으로 NavigationController에서 nil값이 확인되었으며 이를 해결하기 위한 방법을 알아봤다.

알아보니 iOS13 이후의 버전에서는 새롭게 추가되었다는 SceneDelegate에서 이를 관리하게 되었다.

따라서, 아래와 같이 해결하였다.

  window = UIWindow(frame: UIScreen.main.bounds)

        if let window = window {
            let mainVC = MainViewController()
            navigationController = UINavigationController(rootViewController: mainVC)
            window.rootViewController = navigationController    
            // 루트 뷰 컨트롤러를 네비게이션 컨트롤러로 지정
            window.makeKeyAndVisible()
        }

        return true

didFinishLaunchingWithOptions 내에 위 코드를 작성하여 네비게이션 컨트롤러를 지정해주고 rootViewController를 직접 명시해주어야한다.

'iOS' 카테고리의 다른 글

[iOS] REST API, RESTful  (0) 2020.05.16
[iOS] MVC, MVVM, MVP  (0) 2020.05.16
[iOS] App LifeCycle  (0) 2020.05.15
[iOS] SnapKit  (0) 2020.05.13
[iOS] ViewController _ Lifecycle  (0) 2020.05.07