아요 개발 일기

[iOS] Navigation Controller 본문

iOS

[iOS] Navigation Controller

소진이 2023. 1. 3. 15:30

내비게이션 인터페이스란?

주로 계층적 구조의 화면 전화을 위해 사용되는 드릴 다운 인터 페이스 (drill-down interface)입니다. 

 

드릴 다운 인터페이스?

아래 그림과 같이 각 선택할 수 있는 항목에 대한 세부 항목이 존재하는 인터페이스 입니다.

 

출처 - [부스트코스] iOS 프로그래밍


내비게이션 컨드롤러 (Navigation Controller)

컨테이너 뷰 컨트롤러(container view controller) 로써 내비게이션 스택 (navigation stack)을 사용하여 다른 뷰 컨트롤러를 관리합니다.

 

  • View :  버튼이나 이미지 뷰와 같은 것을 말 함 -> 하나 이사의 뷰가 모여서 하나의 화면을 구성
  • View controller : 화면에서 발생하는 이벤트를 처리하고 뷰를 관리하는 객체
  • 컨텐트 뷰 컨트롤러(content view controller)  : 내비세이션 스택에 담겨서 콘텐츠를 보여주게 되는 뷰 컨트롤러들

 

내비게이션 컨트롤러는 두 개의 뷰를 화면에 표시합니다.

  1. 내비게이션 스택뷰에 포함된 최상위 컨텐트 뷰 컨트롤러의 콘텐츠를 나타내는 뷰
  2. 내비게이션 컨트롤러가 직접 관리하는 뷰(내비게이션바 또는 툴바)

추가로 내비게이션 인터페이스에 변화에 따른 특정 애션을 동작하도록 하기 위해 내비게이션 델리게이트 객체를 사용할 수 있습니다.

 

 


내비게이션 스택이란?(navigation stack)

내비게이션 컨트롤러에 의해 관리되는 내비게이션 스택(Navigation stack)은 뷰 컨트롤러를 담을 수 있는 배열과도 같습니다.

 

내비게이션 컨트롤러의 루트 뷰 컨트롤러(root view controller)

  • 내비게이션 스택에 가장 하위에 있는 (가장 먼저 스택에 추가된) 뷰 컨트롤러
  • 루트 뷰 컨트롤러는 내비게이션 스택에서 팝(pop)되지 않음

 

내비게이션 스택의 가장 상위에 있는 (가장 마지막에 푸시(push)된) 뷰 컨트롤러는 최 상위 뷰 컨드롤러로 화면에 보이게 됩니다.

 

 

내비게이션 스택은 푸시(push/pop)을 통하여 아이템(뷰 컨트롤러)을 관리합니다.

 

  • push - 새로운 뷰 컨트롤러를 내비게이션 스택에 푸시 
  • pop - 내비게이션 스택에 있는 뷰 컨트롤러를 삭제하기 위한 팝

UINavigationController 클래스

 

  • 내비게이션 컨트롤러의 생성
// 내비게이션 컨트롤러의 인스턴스를 생성하는 메서드입니다.
// 매개변수로 내비게이션 스택의 가장 아래에 있는 루트 뷰 컨트롤러가 될 뷰 컨트롤러를 넘겨줍니다.
init(rootViewController: UIViewController)

 

  • 내비게이션 스택의 뷰 컨트롤러에 대한 접근
// 내비게이션 스택에 있는 최상위 뷰 컨트롤러에 접근하기 위한 프로퍼티입니다.
var topViewController: UIViewController?

// 현재 내비게이션 인터페이스에서 보이는 뷰와 관련된 뷰 컨트롤러에 접근하기 위한 프로퍼티입니다.
var visibleViewController: UIViewController?

// 내비게이션 스택에 특정 뷰 컨트롤러에 접근하기 위한 프로퍼티입니다.(루트 뷰 컨트롤러의 인덱스는 0 입니다.)
var viewController: [UIViewController]

 

  • 내비게이션 스택의 푸시와 팝에 관한 메서드
// 내비게이션 스택에 뷰 컨트롤러를 푸시합니다.
// 푸시 된 뷰 컨트롤러는 최상위 뷰 컨트롤러로 화면에 표시됩니다.
func pushViewController(UIViewController, animated: Bool)

// 내비게이션 스택에 있는 최상위 뷰 컨트롤러를 팝합니다.
// 최상위 뷰 컨트롤러 아래에 있던 뷰 컨트롤러의 콘텐츠가 화면에 표시됩니다.
func popViewController(animated: Bool) -> UIViewController?

// 내비게이션 스택에서 루트 뷰 컨트롤러를 제외한 모든 뷰 컨트롤러를 팝합니다.
// 루트 뷰 컨트롤러가 최상위 뷰 컨트롤러가 됩니다.
// 삭제된 모든 뷰 컨트롤러의 배열이 반환됩니다.
func popToRootViewController(animated: Bool) -> [UIViewController]?

// 특정 뷰 컨트롤러가 내비게이션 스택에 최상위 뷰 컨트롤러가 되기 전까지 상위에 있는 뷰 컨트롤러들을 팝합니다.
func popToViewController(_ viewController: UIViewController, 
		animated: Bool) -> [UIViewController]?

내비게이션 컨트롤러 생성 방법 

 

1. Libary에서 Navigation Controller 선택

 

2. view controller를 잡음 -> Editor -> Embed In -> Navigation Controller

 

3. View Controller 선택 -> 스토리 보드 오른쪽 아래에 빨간 박스 클릭 -> Navigation Controller 클릭

 


내비게이션바의 구성

 

참고 사이트