storyboard segue를 이용하여 viewController을 띄울수도 있으나,
코드로도 똑같이 어떻게 동작하는지 알아보겠다.
UINavigationController 가 container view controller 일때, 새로운 뷰 컨트롤러들을 현재의 네비게이션 stack에 push할 수 있다.
func presentStockModifyView() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let stockModifyVC = storyboard.instantiateViewController(identifier: "aa")
navigationController?.pushViewController(stockModifyVC, animated: true) //deprecated 방식
}
a-2. 참고) 같은 것을 모달 방식으로 하려면 present 메서드 이용
func presentStockModifyView2() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let stockModifyVC = storyboard.instantiateViewController(identifier: "aa")
present(stockModifyVC, animated: true, completion: nil)
}
b. 네비게이션 컨트롤러에 연결되어있는 현재 뷰컨트롤러에서 새로운 네비게이션 컨트롤러는 네비게이션 방식으로는 가져올 수 없다. (에러남)
//에러
func presentStockModifyView() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
navigationController?.pushViewController(stockModifyNC, animated: true)
}
b-2. 참고) 네비게이션 컨트롤러에 연결되어있는 현재 뷰컨트롤러에서 새로운 네비게이션 컨트롤러를 모달 방식으로 시도해보니 가져와진다...?
func presentStockModifyView() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
present(stockModifyNC, animated: true, completion: nil)
}
앱이 만약 아이폰이 아니라 아이패드처럼 더 큰 화면을 가진 기기에서 실행이 될때, UINavigationController가 아니라 UISplitViewController 같은 더 큰 화면을 관리하는 container view controller를 사용할수도 있다.
show 메서드를 사용하면, pushViewController 방식처럼 현재의 네비게이션 stack에 새로운 뷰 컨트롤러를 직접적으로 호출하는 것이 아니라, 시스템이 primary context를 기반으로 뷰 컨트롤러를 present 하는 것을 결정할 수 있도록 한다.
따라서, show 앞에 현재 뷰에 네비게이션 컨트롤러가 연결되어있는지 확인하는 navigationController?는 생략가능하다.
이 방법은 이전 방법보다 훨씬 dynamic하고 미래의 변동가능성을 대비한 좋은 방법이다.
func presentStockModifyView() {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let stockModifyNC = storyboard.instantiateViewController(identifier: "aaa")
navigationController?.show(stockModifyNC, sender: nil)
}
네비게이션 컨트롤러 안의 뷰컨트롤러에서, 또 다른 네비게이션 컨트롤러를 불러올 수 있나?
-> yes. show 방식으로 가능하다.