밤에 쓴 코드

iOS) ViewController의 특징과 생명주기 본문

iOS

iOS) ViewController의 특징과 생명주기

붱이🦉 2019. 7. 23. 22:35

ViewController의 특징과 생명주기

  • Responsibility (뷰컨트롤러의 책임)

    • 주요한 데이터의 변화에 응답으로 뷰들의 컨텐트들을 업데이트 한다.

    • 뷰들과 함께 사용자와의 대화에 응답한다. - 이벤트 핸들링

    • 뷰들의 사이즈 재조정과 전반적인 인터페이스의 레이아웃을 관리한다.

    • 다른 객체(뷰컨트롤러 등)들과 함께 앱을 구성한다.

  • ViewController Type

    ​ 뷰컨트롤러는 두가지 타입이 존재한다.

    • 일반적으로 흔히 보는 인터페이스 빌더로 생성시 기본으로 생성되는 ViewController는 Content View Controller에 해당한다.

    • NavigationViewController / TabBarViewController 처럼 여러 개의 View Controller를 제어하는 뷰 컨트롤러도 존재하는 데 이들이 ContainerViewController 타입이다

    • Content view controller
      • 앱의 컨텐트의 일부분을 관리하는 뷰 컨트롤러
      • 자신의 모든 뷰들을 스스로 관리한다.
    • Container view controller
      • 다른 뷰 컨트롤러들로 부터 정보를 모은다.
      • 자신의 뷰들과 자신의 자식 뷰 컨트롤러들의 root view들을 관리한다.
      • 직접 자식 뷰 컨트롤러릐 컨텐츠를 관리하지는 않고 root view의 크기조절과 위치조절에 대해서만 관리한다.
  • Life Cycle Method

    뷰 컨트롤러에는 생명주기가 존재한다.

    뷰 컨트롤러간에는 전환이 존재한다.

    전환은 되지만 이전 뷰 컨트롤러의 뷰가 유지되는 경우도 있고, 아닌 경우도 존재한다.

    또 전환될 뷰 컨트롤러에서 이전 뷰 컨트롤러의 정보를 이어받아서 작업을 해야하는 경우도 빈번하다.

    이를 위해 그 해당시점을 이벤트화 해두어서 그 시점에서 해야할 동작을 지정해둘 수있다.

    • viewDidLoad()

      • 뷰컨트롤러의 var view: UIView!프로퍼티는 지연로딩된다. view가 필요로 될 때 view가 nil이면 loadView() 메소드를 호출하여 view를 로드한다.
      • loadView()직 후 에 호출되는 콜백메소드이다.
    • viewWillAppear()

      • 뷰컨트롤러의 root view 가 로드된 이후에 window 의 뷰 계층으로 더해지기 직 전 호출되는 메소드이다.
    • viewDidAppear()

      • window 의 root view가 뷰 계층으로 더해진 직 후 호출되는 메소드이다.
    • viewWillDisAppear()

      • window 의 root view가 뷰 계층에서 제거되기 직 전 호출되는 메소드이다.
    • viewDidDisAppear()

      • window 의 root view가 뷰 계층에서 제거된 직 후 호출되는 메소드이다.

UIViewController_Class_Reference_2x_ddcaa00c-87d8-4c85-961e-ccfb9fa4aac2

Tip

  • 뷰 컨트롤러데이터 객체와 뷰 사이의 중개자이다.

  • 뷰 컨트롤러와 모델(데이터 오브젝트)의 책임을 깔끔하게 분리하는 걸 유지 해야한다.

  • 뷰 컨트롤러는 Responder객체이고 Responder Chain 에 연결된다. 따라서 view controller 도 이벤트 헨들링을 할 수있다.

  • View Life Cycle

    Present - CurrentContext / FullScreen 은 presentingViewController 의 rootView를 뷰계층에서 제거한다

    Present - OverCurrentContext / OverFullScreen 은 presentingViewController 의 rootView를 뷰계층에서 제거하지 않는다

  • Present - CurrentContext, fullScreen

    • Context

    • Present : beforeViewController -> afterViewController

    • - afterViewController.viewDidload()
      - beforeViewController.viewWillDisAppear()
      - afterViewController.viewWillAppear()
      - afterViewController.viewDidAppear()
      - beforeViewController.viewDisappear()
    • Dissmiss : afterViewController -> beforeViewController

    • - afterViewController.viewWillDisappear()
      - beforeViewController.viewWillAppear()
      - beforeViewController.viewWillAppear()
      - afterViewController.viewDisDisappear()

      뷰 계층에서 사라질 뷰 WillDisappear()

      뷰 계층에 추가될 뷰 WillAppear()

      뷰 계층에 추가된 뷰 DidAppear()

      *뷰 계층에서 사라질 뷰 * DidDisappear()

      의 순서를 거치며 view가 전환된다.

CurrentContext / FullScreen 은 기존 presentingViewController 의 rootView가 뷰의 계층(window의 subView)에서 제거 된다.

따라서 최상단에 뜰 뷰 이전의 뷰가 disAppear()되는 생명주기 메소드가 호출된다.


  • Present - OverCurrentContext, OverFullScreen

OverContext

  • Present : beforeViewController -> afterViewController

  • - afterViewController.viewDidload()
    - afterViewController.viewWillAppear()
    - afterViewController.viewDidAppear()
  • Dissmiss : afterViewController -> beforeViewController

  • - afterViewController.viewWillDisappear()
    - afterViewController.viewDisDisappear()

    뷰 계층에 추가될 뷰 WillAppear()

    뷰 계층에 추가될 뷰 DidAppear()

    *뷰 계층에서 사라질 뷰 * DidDisappear()

    의 순서를 거치며 view가 전환된다.

OverCurrentContext / OverFullScreen 은 기존 presentingViewController 의 rootView가 뷰의 계층(window의 subView)에서 제거되지 않는다.

Presentdisappear 되지 않으며, dismiss시 다시 appear도 다시 호출되지 않는다

  • Show (Push)

    • NavigationViewController 에서의 Life Cycle 호출 순서

NaviLifeCycle

  • Push : beforeView -> afterView

  • - afterViewController.viewDidload()
    - beforeViewController.viewWillDisappear()
    - afterViewController.viewWillAppear()
    - beforeViewController.viewDidDisappear()
    - afterViewController.viewDidAppear()
  • Pop : afterView -> beforeView

  • - afterView.ControllerviewWillDisappear()
    - beforeViewController.viewWillAppear()
    - afterViewController.viewDisDisappear()
    - beforeViewController.viewDidAppear()

네비게이션뷰컨트롤러는 두 개의 뷰 컨트롤러가 라이프 사이클 메소드를 주고 받듯 순서를 거치며 view가 전환된다.

'iOS' 카테고리의 다른 글

URLSession Tutorial: Getting Started 번역본  (1) 2019.10.20
iOS) IBOutlet / IBAction  (0) 2019.07.23
iOS) Segue  (0) 2019.07.23
iOS) UITabBarController, UITabBar  (0) 2019.07.13
Comments