Navigation Controller 동작 방식

ellyheetov·2021년 2월 12일
0
post-thumbnail

화면을 전환할 때 연관성이 많거나 데이터를 서로 주고받아야 하는 경우가 있다. 이런 경우 흔히 사용하는 것이 Navigation Controller이다.

Navigation Controller란?

class UINavigationController : UIViewController

A container view controller that defines a stack-based scheme for navigating hierarchical content.

Navigation Controller는 Container View Controller이므로 내부적으로 다른 컨트롤러를 포함하고있다. Controller끼리의 화면 이동을 처리해주고, 현재 위치에 대한 내비게이션 역할을 한다.

따로 View를 포함하고 있지 않으므로 하나의 페이지를 담당하지는 않는다. 다른 Controller와 결합하여 부분적으로 화면을 구성한다. StoryBoard에 2개의 화면으로 구성되어 있으나 실제로는 하나의 화면으로 나타나는 이유도 여기에 있다.

Navigation Controller는 하나 이상의 View Controller를 가지고 있는 컨테이너이다. 임의의 view controller를 선택하면 현재 보이던 view controller는 사라지고 선택한 view controller가 화면에 보여지게 된다.

Navigation Controller는 child view Controller를 stack 형식으로 가지고 있다. 첫 번째 View Controller는 root view controller가 되고 stack에 가장 아래에 존재한다. 스택에 마지막에 있는 요소는 현재 보여지고 있는 view controller를 의미한다. segue나 다른 메소드를 이용하여 view controller를 추가 또는 제거 할 수 있다.

root view를 제외한 모든 view는 뒤로가기 버튼을 제공한다. 사용자의 화면에 navigation bar에 back 버튼을 누르는 경우 가장 top에 있는 view controller를 제거하는것과 동일하다.

Stack 구조를 이용하여 View Controller를 쌓고 있지만 현재 보여지는 화면은 1개이다. 때문에 Debug View Hierarchy를 통해서는 확인할 수 없다. 이전에 있었던 View Controller가 화면에서 사라졌지만, 메모리상에는 계속해서 남아있는 상태이다.

예시

현재 3개의 View Controller가 있다.

화면 전환에 따른 스택의 상태를 보여준다. 가장 첫번째 화면인 root view controller의 view가 보여지고 있는 상태이다.
Screen Shot 2021-02-12 at 9 09 08 PM

두 번째 화면이 보여지면서 스택에는 second view controller가 쌓인다.
Screen Shot 2021-02-12 at 9 09 14 PM

뒤로 돌아가게 되면 스택에서 가장 위에있는 요소가 pop되고 그 이전 view controller가 화면에 나타나게 된다.
Screen Shot 2021-02-12 at 9 10 29 PM

navigation bar는 navigation controller에 의하여 관리되는데, child view controller에 의해 제공된 정보를 이용하여 업데이트 된다. isToolbarHidden을 이용하여 화면에서 제거할 수도 있다.

Delegate

Navigation Controller는 Delegate Object를 이용하는데, view controller를 push, pop하는 것을 override하여 사용한다. Delegate를 이용할 때에는 반드시 UINavigation ControllerDelegate protocol을 사용해야한다.

정리

Navigation View Controller는 View Container 중 하나로써, 스택을 기반으로 view controller들을 관리하는 controller이다.

profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

0개의 댓글