네비게이션 컨트롤러는 뷰 컨트롤러의 특별한 종류로 계층적인 성격을 띠는 콘텐츠 구조를 관리하기 위한 컨트롤러임.
*위 그림에 빨간색으로 표기된 부분을 '루트 뷰 컨트롤러'라고 부른다.
내비게이션 컨트롤러 객체의 메소드를 사용하면 스택의 정보를 수정 할 수 있다.
기본적으로 스택의 최상위에 뷰 컨트롤러를 추가할 때는
pushViewController(_:animated:)
메소드를 사용한다.
반대로 스택의 최상위 뷰 컨트롤러를 제거할 때에는 아래를 사용해주면 된다.
popViewController(animated:)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func moveByNavis(_ sender: Any) {
// 두번째 뷰 컨트롤러 인스턴스를 가져온다.
guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") else {
return
}
// 화면을 전환한다.
self.navigationController?.pushViewController(uvc, animated: true)
}
}
guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") else {
return
}
스토리보드에서 설정했던 identify를 이용해서 "Second VC"뷰컨트롤러를 가져오는 거임.
instantiateViewController를 메소드를 호출해서 뷰컨의 인스턴스를 받아온 다음. 옵셔널을 해제하기 위해서 uvc에 바인딩함.
self.navigationController?.pushViewController(uvc, animated: true)
화면 전환을 처리하는 부분임.
pushViewController는 아까 스택 최상위에 뷰 컨 uvc를 추가하는 것이지만,
사용자의 언어로 봤을때는 화면을 전환하는 결과가 일어남!!!
만약, 이상황에서 movePresent 메소드를 사용해서 이동하면 내비게이션 바가 추가될 것인가?
@IBAction func movePresent(_ sender: UIButton) {
guard let uvc = self.storyboard?.instantiateViewController(withIdentifier: "SecondVC") else {
return
}
self.present(uvc, animated: false)
}
위에처럼 내비게이션 바는 없어진 채로 나옴!!!