[TIL] UINavigationController

valse·2022년 8월 31일
0

iOSInterViewController

목록 보기
7/8
post-thumbnail

UINavigationController

UINavigationController 는 컨테이너 뷰 컨트롤러이며, navigation 이 관리하는 하나 혹은 그 이상의 계층적 뷰 컨트롤러를 상황에 따라 화면에 띄워줄 수 있도록 한다.
UINavigationController 에서 다음 화면으로 이동(push)하여 이전 뷰 컨트롤러를 가린다.
이전 화면으로 돌아갈 수 있는 백버튼 아이템을 네비게이션 바에서 기본적으로 제공한다.

UINavigationControllerrootViewControllerUINavigationController 객체가 관리하는 배열의 최하단에 위치한다.
앱에 보여지는 화면들은 이 배열의 상단으로 하나씩 올라오며 관리된다.
즉, 현재 보여지는 화면을 관리하는 뷰 컨트롤러가 UINavigationController 객체의 navigation stack이 관리하는 계층 뷰 컨트롤러의 최상단 요소이다.
viewControllers 속성에서 UINavigationController 에서 관리중인 뷰 컨트롤러 배열을 확인할 수 있다.

toolbar 는 기본적으로 숨김 설정이 되어 있지만, 상황에 따라 UINavigationController 의 생성자를 사용해서 초기화할 수 있다.


활용

  1. UINavigationControllerDelegate 를 채택하고 delegate 를 활용해서 동작을 조정할 수 있다.
    델리게이트는 뷰 컨트롤러의 푸시 또는 팝을 재정의하고 커스터마이징된 애니메이션이 적용된 전환을 제공한다.
    willShowdidShow를 지원한다.
    이 델리게이트로 특정 UINavigationController 의 뷰 컨트롤러가 보여지기 전에 해야 할 작업을 처리한다거나 애니메이션을 구현할 수 있겠다.

  2. navigation stack의 각 뷰 컨트롤러를 직접 push, pop 할 수 있다.
    pushViewController(_:animated:) 에서 첫번째 인자로 전달되는 뷰 컨트롤러가 navigation stack 의 최상단 요소가 된다. 탭바 컨트롤러는 전달할 수 없다!
    navigation bar 는 뷰 컨트롤러에 따라 업데이트된다.

  3. func popViewController(animated: Bool) -> UIViewController?는 리턴형 함수이다.
    최상단 뷰 컨트롤러를 지우고, 그 아래의 뷰 컨트롤러를 화면에 띄운다.
    최상단 뷰 컨트롤러가 루트 뷰 컨트롤러라면 아무런 동작을 하지 않는다.
    즉, 루트 뷰 컨트롤러는 지울 수 없다.

    이 점과 맞물려서 루트 뷰 컨트롤러가 무지막지하게 많으면 메모리가 많이 할당되어 있을 수 있다는 점을 어느 정도 유추할 수 있다.
    navigation bar 는 push와 마찬가지로 뷰 컨트롤러에 따라 업데이트된다.
    경우에 따라 루트 뷰 컨트롤러를 제외한 모든 뷰 컨트롤러를 pop하는 popToRootViewController(animated:) 메소드 또한 사용할 수 있다.


정리

  1. UINavigationController 객체는 stack 계층 구조로 하나 또는 그 이상의 뷰 컨트롤러를 관리하고 상황에 따라 적절한 뷰 컨트롤러를 화면에 띄우는 역할을 한다.
  2. push, pop을 활용하여 뷰 컨트롤러 이동이 가능하며, 이 경우 백 버튼 아이템과 왼쪽 가장자리 스와이프로 이전 화면으로 돌아가는 기능이 자동 구현된다.
    navigation stack에서 뷰 컨트롤러를 더하거나 지울 수도 있다.
    그러나 루트 뷰 컨트롤러는 pop할 수 없다.
  3. delegate 패턴으로 UINavigationController 의 특정 뷰 컨트롤러가 보여지기 전에 처리해야 할 전처리 작업을 수행할 수 있으며, 애니메이션 구현도 가능하다.
  4. UINavigationController 자체를 확장해서 기본 구현 애니메이션에 직접 개입하는 것도 가능하다.

참고자료

애플 공식 문서 - UINavigationController

profile
🦶🏻🦉(발새 아님)

0개의 댓글