UINavigationController
UINavigationController
는 컨테이너 뷰 컨트롤러이며, navigation 이 관리하는 하나 혹은 그 이상의 계층적 뷰 컨트롤러를 상황에 따라 화면에 띄워줄 수 있도록 한다.
UINavigationController
에서 다음 화면으로 이동(push)하여 이전 뷰 컨트롤러를 가린다.
이전 화면으로 돌아갈 수 있는 백버튼 아이템을 네비게이션 바에서 기본적으로 제공한다.
UINavigationController
의 rootViewController
는 UINavigationController
객체가 관리하는 배열의 최하단에 위치한다.
앱에 보여지는 화면들은 이 배열의 상단으로 하나씩 올라오며 관리된다.
즉, 현재 보여지는 화면을 관리하는 뷰 컨트롤러가 UINavigationController
객체의 navigation stack
이 관리하는 계층 뷰 컨트롤러의 최상단 요소이다.
viewControllers
속성에서 UINavigationController
에서 관리중인 뷰 컨트롤러 배열을 확인할 수 있다.
toolbar
는 기본적으로 숨김 설정이 되어 있지만, 상황에 따라 UINavigationController
의 생성자를 사용해서 초기화할 수 있다.
UINavigationControllerDelegate
를 채택하고 delegate
를 활용해서 동작을 조정할 수 있다.
델리게이트는 뷰 컨트롤러의 푸시 또는 팝을 재정의하고 커스터마이징된 애니메이션이 적용된 전환을 제공한다.
willShow
와 didShow
를 지원한다.
이 델리게이트로 특정 UINavigationController
의 뷰 컨트롤러가 보여지기 전에 해야 할 작업을 처리한다거나 애니메이션을 구현할 수 있겠다.
navigation stack
의 각 뷰 컨트롤러를 직접 push, pop 할 수 있다.
pushViewController(_:animated:)
에서 첫번째 인자로 전달되는 뷰 컨트롤러가 navigation stack
의 최상단 요소가 된다. 탭바 컨트롤러는 전달할 수 없다!
navigation bar
는 뷰 컨트롤러에 따라 업데이트된다.
func popViewController(animated: Bool) -> UIViewController?
는 리턴형 함수이다.
최상단 뷰 컨트롤러를 지우고, 그 아래의 뷰 컨트롤러를 화면에 띄운다.
최상단 뷰 컨트롤러가 루트 뷰 컨트롤러라면 아무런 동작을 하지 않는다.
즉, 루트 뷰 컨트롤러는 지울 수 없다.
이 점과 맞물려서 루트 뷰 컨트롤러가 무지막지하게 많으면 메모리가 많이 할당되어 있을 수 있다는 점을 어느 정도 유추할 수 있다.
navigation bar
는 push와 마찬가지로 뷰 컨트롤러에 따라 업데이트된다.
경우에 따라 루트 뷰 컨트롤러를 제외한 모든 뷰 컨트롤러를 pop하는 popToRootViewController(animated:)
메소드 또한 사용할 수 있다.
UINavigationController
객체는 stack 계층 구조로 하나 또는 그 이상의 뷰 컨트롤러를 관리하고 상황에 따라 적절한 뷰 컨트롤러를 화면에 띄우는 역할을 한다.delegate
패턴으로 UINavigationController
의 특정 뷰 컨트롤러가 보여지기 전에 처리해야 할 전처리 작업을 수행할 수 있으며, 애니메이션 구현도 가능하다.UINavigationController
자체를 확장해서 기본 구현 애니메이션에 직접 개입하는 것도 가능하다.