ref : Fast Campus
- Content View Controller
- 화면을 구성하는 뷰를 직접 구현하고 관련된 이벤트를 처리하는 뷰 컨트롤러
- 일반적으로 스토리보드 처음 생성했을 때 기본 뷰 컨트롤러
- Containter View Controller
- 하나 이상의 Child View Controller 를 가지고 있다.
- 하나 이상의 Child View Controller 를 관리하고 레이아웃과 화면 전환을 담당한다.
- 화면 구성과 이벤트 관리는 Child View Controller 에서 한다.
- 대표적으로 Navigation Controller 와 TabBar Controller 가 있다.
- 여러 개의 View Controller 를 갖는다.
- Navigation Stack 이라는 정렬된 배열을 사용하여 자식 View Controller 를 관리한다. 스택 구조를 갖는다.
- 화면이 전환 될수록 stack 에 append 되고 뒤로가기를 누르면 pop 된다고 생각하면 된다.
- 첫번째 컨트롤러는 root ViewController 이고 최하위에 있다.
- Navigation Bar 의 구조
- iOS 의 화면 전환 방법은 크게 2가지로 분류된다.
- 소스코드를 통해 전환하는 방식
- Storyboard 를 통해 전환하는 방식
- 작게는 3가지로 분류할 수 있다.
- ViewController 에서 다른 ViewController 를 호출하여 전환하기 (present)
- NavigationController 를 이용하여 화면 전환하기 (push)
- 화면 전환용 객체 세그웨이 (Segueway) 를 사용하여 화면 전환하기
그 밖에 ViewController 의 View 위에 다른 View 를 가져와 바꿔치는 방법도 있지만 이 방법은 지양하는 게 좋다. View 위에 View 를 바꿔치면 메모리 누수 발생 위험이 있기 때문이다.
- 현재 ViewController 에서 이동할 대상의 ViewController 를 직접 호출해서 화면에 표시하는 방법. Presentation 방식이라고 부르기도 함.
- 이 방법은 기존 ViewController 에 다른 ViewController 를 덮는 방식.
- present 라는 메서드에 이동할 화면의 ViewController 를 넘겨주면 이전 화면에서 이동할 화면의 ViewController 가 표시된다.
- present 함수 형식
func present( _ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
첫번째 매개변수에는 화면전환 하려는 ViewController 의 인스턴스를 넣는다.
두번째 매개변수에는 화면전환 애니메이션 효과 여부를 넣는다.
세번째 매개변수에는 completion closure 를 선언해서 화면전환이 마칠 때 호출되는 closure 를 넣는다.
- 화면 전환 방식은 비동기 방식으로 처리되기 때문에 화면 전환이 이루어진 다음에 뭔가 코드로 처리해야 할 로직이 있다면 completion 에 로직을 작성하면 된다.
- present 되었던 화면에서 이전화면에서 돌아가게 하는 메서드는 dismiss 이다. 이 메서드는 이전화면으로 돌아가는 기능이기 때문에 ViewController 의 인스턴스를 매개변수로 받을 필요가 없다.
- dismiss 함수 형식
func dismiss(animated flag: Bool, completion: (()->Void)? = nil)
completion 클로저는 이전화면으로 돌아가는 동작이 마무리 될 때 실행된다.
- dismiss 는 기존 화면을 덮고 있는 화면을 걷어내는 개념으로 생각하면 된다.
- Navigation Controller 는 계층 성격의 컨트롤러이다.
- pushViewController 로 Navigation Stack 에 화면을 추가하고,
popViewController 로 Navigation Stack 의 화면을 제거한다.
- push 와 pop 함수 형식
func pushViewController(_ viewController: UIViewController, animated: Bool) func popViewController(animated: Bool) -> UIViewController?
- 세그웨이 : 두 개의 뷰 컨트롤러 사이에 연결된 화면 전환 객체
- 스토리보드에 출발지와 목적지를 직접 지정하는 방식
- Action Segueway
출발점이 Button, Cell 등인 경우
- Manual Segueway
출발점이 View Controller 자체인 경우