[iOS] View Controller 와 화면 전환

김상우·2021년 11월 19일
0

ref : Fast Campus

View Controller

  • Content View Controller
    • 화면을 구성하는 뷰를 직접 구현하고 관련된 이벤트를 처리하는 뷰 컨트롤러
    • 일반적으로 스토리보드 처음 생성했을 때 기본 뷰 컨트롤러
  • Containter View Controller
    • 하나 이상의 Child View Controller 를 가지고 있다.
    • 하나 이상의 Child View Controller 를 관리하고 레이아웃과 화면 전환을 담당한다.
    • 화면 구성과 이벤트 관리는 Child View Controller 에서 한다.
    • 대표적으로 Navigation Controller 와 TabBar Controller 가 있다.
    • 여러 개의 View Controller 를 갖는다.

UINavigationController

  • Navigation Stack 이라는 정렬된 배열을 사용하여 자식 View Controller 를 관리한다. 스택 구조를 갖는다.

  • 화면이 전환 될수록 stack 에 append 되고 뒤로가기를 누르면 pop 된다고 생각하면 된다.
  • 첫번째 컨트롤러는 root ViewController 이고 최하위에 있다.
  • Navigation Bar 의 구조


3가지 화면 전환 방법

  • iOS 의 화면 전환 방법은 크게 2가지로 분류된다.
  1. 소스코드를 통해 전환하는 방식
  2. Storyboard 를 통해 전환하는 방식
  • 작게는 3가지로 분류할 수 있다.
  1. ViewController 에서 다른 ViewController 를 호출하여 전환하기 (present)
  2. NavigationController 를 이용하여 화면 전환하기 (push)
  3. 화면 전환용 객체 세그웨이 (Segueway) 를 사용하여 화면 전환하기

그 밖에 ViewController 의 View 위에 다른 View 를 가져와 바꿔치는 방법도 있지만 이 방법은 지양하는 게 좋다. View 위에 View 를 바꿔치면 메모리 누수 발생 위험이 있기 때문이다.


(1) ViewController 에서 다른 ViewController 를 호출

  • 현재 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 는 기존 화면을 덮고 있는 화면을 걷어내는 개념으로 생각하면 된다.

(2) NavigationController

  • Navigation Controller 는 계층 성격의 컨트롤러이다.
  • pushViewController 로 Navigation Stack 에 화면을 추가하고,
    popViewController 로 Navigation Stack 의 화면을 제거한다.
  • push 와 pop 함수 형식
func pushViewController(_ viewController: UIViewController,
  animated: Bool)

func popViewController(animated: Bool) -> UIViewController?

(3) 세그웨이 (Segueway)

  • 세그웨이 : 두 개의 뷰 컨트롤러 사이에 연결된 화면 전환 객체
  • 스토리보드에 출발지와 목적지를 직접 지정하는 방식
  • Action Segueway
    출발점이 Button, Cell 등인 경우

  • Manual Segueway
    출발점이 View Controller 자체인 경우
profile
안녕하세요, iOS 와 알고리즘에 대한 글을 씁니다.

0개의 댓글