→ 위와 같은 drill-down interface
---
View Controller 를 담을 수 있는 배열과 같다고 생각
스택의 가장 하위에 있는 View Controller 가 Root View Controller 이다
→ Root View Controller 는 Pop 되지 않음. 항상 남아 있음
스택의 가장 상위에 있는 View Controller 가 현재 화면에 보이게 되는 뷰임
Note: Navigation Stack 이란 이름에서 알 수 있듯이, 스택의 요소들을 push/pop 하면서 관리가 가능
→ 새로운 view controller = push
→ view controller 삭제 = pop
→ 위 스택이 최종 상태. 총 2개의 UIViewController 인스턴스 생성
→ "뷰 컨트롤러 2"를 Pop 한 상태.
→ 화면 좌측 상단의 뒤로가기 버튼을 누름으로써 인스턴스 메모리 해제 완료
→ 계속 Pop 을 하여 Navigation Stack 의 Root View Controller 까지 온 상태.
Navigation Stack 의 Push/Pop 관련 메서드
// 내비게이션 스택에 뷰 컨트롤러를 푸시합니다.
// 푸시 된 뷰 컨트롤러는 최상위 뷰 컨트롤러로 화면에 표시됩니다.
func pushViewController(UIViewController, animated: Bool)
// 내비게이션 스택에 있는 최상위 뷰 컨트롤러를 팝합니다.
// 최상위 뷰 컨트롤러 아래에 있던 뷰 컨트롤러의 콘텐츠가 화면에 표시됩니다.
func popViewController(animated: Bool) -> UIViewController?
// 내비게이션 스택에서 루트 뷰 컨트롤러를 제외한 모든 뷰 컨트롤러를 팝합니다.
// 루트 뷰 컨트롤러가 최상위 뷰 컨트롤러가 됩니다.
// 삭제된 모든 뷰 컨트롤러의 배열이 반환됩니다.
func popToRootViewController(animated: Bool) -> [UIViewController]?
// 특정 뷰 컨트롤러가 내비게이션 스택에 최상위 뷰 컨트롤러가 되기 전까지 상위에 있는 뷰 컨트롤러들을 팝합니다.
func popToViewController(_ viewController: UIViewController,
animated: Bool) -> [UIViewController]?
스토리보드를 사용하여 내비게이션 인터페이스 구성하기
스토리보드에서 내비게이션 컨트롤러에 포함할 뷰 컨트롤러를 선택합니다.
메뉴에서 [Editor] - [Embed In] - [Navigation Controller]를 차례로 선택합니다.
선택한 뷰 컨트롤러가 내비게이션 컨트롤러의 루트 뷰 컨트롤러가 되면서 내비게이션 컨트롤러가 생성됩니다.
위의 방법 외에도 객체 라이브러리에서 내비게이션 컨트롤러를 드로그 앤 드롭해서 캔버스에 올릴 경우 테이블 뷰를 포함한 루트 뷰 컨트롤러가 생성되면서 내비게이션 컨트롤러가 만들어집니다.
코드작성을 통해 내비게이션 인터페이스 구성하기
코드로 내비게이션 컨트롤러를 생성할 경우, 내비게이션 컨트롤러가 생성되기 원하는 적절한 지점에 내비게이션 컨트롤러를 생성할 수 있습니다. 예를 들어 내비게이션 컨트롤러가 애플리케이션 윈도우(window)의 루트 뷰로서 역할을 한다면, 내비게이션 컨트롤러를 applicationDidFinishLaunching:
메서드에 구현할 수 있습니다.
루트 뷰 컨트롤러가 될 뷰 컨트롤러를 생성합니다. 이 객체는 처음에 내비게이션 스택의 최상위 뷰 컨트롤러가 화면에 보이게 되고 내비게이션 바에 뒤로가기 버튼이 생성되지 않습니다.
init(rootViewController: UIViewController)
메서드를 통해 내비게이션 컨트롤러를 초기화하고 생성합니다.
내비게이션 컨트롤러를 윈도우의 루트 뷰 컨트롤러로 설정합니다. 아래의 예시 코드를 살펴봅시다.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// 루트 뷰 컨트롤러가 될 뷰 컨트롤러를 생성합니다.
let rootViewController = UIViewController()
// 위에서 생성한 뷰 컨트롤러로 내비게이션 컨트롤러를 생성합니다.
let navigationController = UINavigationController(rootViewController: rootViewController)
self.window = UIWindow(frame: UIScreen.main.bounds)
// 윈도우의 루트 뷰 컨트롤러로 내비게이션 컨트롤러를 설정합니다.
self.window?.rootViewController = navigationController
self.window?.makeKeyAndVisible()
return true
}
위 내용은 "https://www.boostcourse.org/mo326/lecture/16857" 을 참고하여 공부한 내용을 개인적으로 정리하였습니다.