로그인 성공이후는 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()
스위칭 하는 메서드를 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()