2018년 8월 17일 금요일

네비게이션 컨트롤의 rootViewController 변경하기

 앱 최초 실행시에 intro -> 가입유도 / 또는 로그인

로그인 성공이후는 main 으로 실행 되는 앱이 있다고 하면

어느 경우는 intro가 navigation controller의 rootViewController 이고

어느 경우는 main이 navigation controller의 rootViewCotnorller  가 된다.

main으로 계속 실행되던 앱에서 logout 기능을 이용하면 login viewController가

navigationViewController에 rootViewController가 되어 실행된다.


스토리 보드를 이용하고 segue를 잘 쓰려고 하는데 앱 최초 진입점이 다르고
navigation controller를 결국에는 storyboard Embed in 으로 해서 만들 수 도 없고

결국 코드로 ViewController를 storyboard에서 찾아다가 push 하고 navigation controller를 초기 화 하고 복잡하게 ... 스파게티...


이러한 앱을 개발 할때 다음과 같이 하면 좀 수월 하다.

1. navigation controller 는 storyboard에 만들지 않는다.

2. navigation controller에 root가 될 viewController 들 ( 2개 또는 3개) 는
attribute inspector에서 top bar 항목을 설정 해준다.

그래야 하위 segue가 연결된 viewController들이 네비바가 있는것처럼 디자인 할 수 있다.

3. init viewController 및 navgation controller의 rootController를 appdelegate.swift에서 구현 한다.



didFinishLaunchingWithOptions 메서드에서 UserDefaults 등으로 구현하여 현재 상황에 맡는 ViewController를 rootViewController로 하여 navigation Controller를 설정 하고 시작 한다.

//intro
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let root = storyboard.instantiateViewController(withIdentifier: "IntroViewController")
        nvc = UINavigationController(rootViewController: root)


        window?.rootViewController = nvc

        window?.makeKeyAndVisible()


로그인 등이 완료되어 main으로 시작 하거나, 또는 로그 아웃으로 인해 다시 intro로 시작 해야 하는 경우를 대비해 
스위칭 하는 메서드를 appdelegate에 구현 한다.
func switchIntro() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "IntroViewController")
        nvc = UINavigationController(rootViewController: vc)
        
        self.window?.rootViewController = nvc
        window?.makeKeyAndVisible()
    }
    
    func switchMain() {
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "MainViewController")
        nvc = UINavigationController(rootViewController: vc)
        
        self.window?.rootViewController = nvc
        window?.makeKeyAndVisible()

    }



어떠한 ViewController에서 navigaion Controller의 루트를 변경 하고자 하면 다음과 같이 하면 된다.
let appDelegate = UIApplication.shared.delegate as! AppDelegate
            
            appDelegate.switchIntro()