Navigation Controller에 대하여
1.
UINavigationController의 동작 방식
Navigation Controller란 계층으로 구성된 스택 기반의 View Controller이다.
스토리보드로 다음과 같이 만들고 실행했을 때,
처음에 나오는 이 화면이 Navigation Controller가 지정한 Root View Controller이다.
다음 화면으로 만들고 싶을 때에는, 다른 View Controller를 만들고 대리자를 통하여 재정의한
push 동작에 의해 새로 만든 View Controller를 위의 TealViewController 위에 쌓는 것이다.
ViewController들이 배열에 순차적으로 쌓인다고 생각해보면
Navigaiton View Controller = [여러 개의 View Controller]가 되는 것이다.
버튼을 눌렀을 때 push가 되고, 다음 스택(화면)으로 넘어가게 된다.
push가 될 때에 기존의 View Controller는 메모리에서 제거되지 않으므로
메모리 관리도 주의할 필요가 있다.
반대로 제거를 할 때에는, Pop이라고 하는데,
뒤로 가기 버튼이나 왼쪽 가장자리 스와이프를 통해 이전 View Controller로
넘어갈 수 있다. 메모리에서 pop 될 때 View Controller의 인스턴스가
다른 곳에서 참조되지 않으면 메모리에서 해제되서, navigation stack에서 삭제된다.
2.
구조
Navigation Controller의 내부 구조는 그림과 같이 4가지로 나뉜다.
(1)
viewControllers
viewControllers는 여러 개의 viewController를 관리하는 controller이다.
navigation controller의 객체에서 여러 view controller들을 관리하기 위해서
navigation stack이라는 것을 통해서 관리를 한다.
navigation stack은 배열을 통해서 순서대로 view controller들을 관리한다.
navigation stack은 viewController들의 배열 형태로 가지고 있고
이들은, push와 pop을 통해 생성하고 제거할 수 있다.
그리고 viewController의 인덱스 접근을 통해서 viewController의 객체에도 접근이 가능하다.
(2)
navigationBar
기본 구성 요소로는 뒤로 가기 버튼, 가운데 제목, 선택적으로 생성하는 오른쪽 버튼이 있다.
navigation controller에서 push를 할 때, push한 viewController에서는 따로 설정을
안 해줘도 자동적으로 navigation bar가 생성이 된다.
(3)
toolBar
인터페이스의 아래쪽에 하나 이상의 버튼을 표시하는 컨트롤이다.
기본적으로 자동 생성되지 않고
내비게이션 컨트롤러의 속성 isToolbarHidden은 기본값이 true이므로
false로 변경하면 생성이 된다.
그리고 toolbarItems에 원하는 버튼을 추가하여 사용하면 된다.
Toolbar가 설정된 것을 확인할 수 있다.
(4)
delegate
모든 Controller들은 delegate가 선언이 되어있다.
특정 이벤트 관련 처리를 위해서 대리자를 미리 만들어놓은 것이다.
navigation controller에서는 push, pop 될 때의 이벤트를 처리한다.
보통 특정 View Controller의 생성 관련 이벤트 및 화면 이동 간 애니메이션 설정을 위해 사용한다.
3.
Navigation Controller 사용 방법
Navigation Controller의 설정 방법은
위와 같이 스토리보드로 Navigation Controller의 Root ViewController로 지정해주는 방법이 있고
다른 하나는 SceneDelegate에서 코드로 작성해주는 방법이 있다.
SceneDelegate에서 다음과 같이 코드를 설정해주면 된다.
다른 컨트롤러로 이동하는 방법에는 push와 show가 있다.
이동하는 것뿐만 아니라, 데이터 전송도 가능하다.
다음 View Controller(YelloViewController)로 넘어가는 버튼에서 contentText라는
TextField의 내용을 다음 VC의 변수에 저장하고 저장된 내용을
지정된 Label에 보여주기로 했다.
입력한 내용이 label에 잘 나오는 것을 확인할 수 있다.
그리고 Navigation을 통한 push를 하게 되면 자동으로 Navigation Bar가 생성되는 것을 확인할 수 있었다.