[ios] uiviewcontroller The View Controller Hierarchy View Controller Life Cycle

앱 구조의 뼈대
모든 앱에 반드시 하나 이상, 대부분 많은 수의 ViewController구성

주요 역할

  1. View Management
  2. Data Marshaling
  3. User Interactions
  4. Resource Management
  5. Adaptivity

1. View Management

가장 중요한 역할 - 뷰 계층 관리
모든 뷰컨트롤러마다 RootView를 지니며, 화면에 표시하기 위해서는 해당 RootView 계층에 속해야 함

Imgur

1.1. Two types of view Controllers

  • Content View Controllers
    • 모든 뷰를 단독으로 관리
    • UIViewController, UITableViewController, UICollectionViewController등
  • Container View Controllers
    • 자체뷰 + 하나 이상의 자식 뷰 컨트롤러가 가진 루트뷰 관리
    • 컨터에너는 컨텐츠를 관리하는 것이 아니라 루트뷰만 관리하며 컨테이너 디자인에 따라 크기 조정
    • UINavigationController, UITabbarController, UIPageViewController 등

2. Data Marshaling

MVC (Model - View - Controller)
자신이 관리하는 View와 Data간 중개 역할
Imgur

marshal이란 단어는 사전에서 찾아보면 명사로 쓰일 때는 군대의 원수나 경찰서장, 법원의 집행관 등을 의미하고 , 동사로서는 (특정 목적을 위해 사람.사물.생각등을) 모으다, 결집시키다 라는 뜻과 (많은 사람들을) 통제하다 라는 뜻이 있다. 즉, 많은 것들을 모으거나 통제한다는 관리적인 개념의 단어라고 할 수 있다.
프로그래밍 언어에선 객체의 메모리 구조를 저장이나 전송을 위해서 적당한 자료형태로 변형하는 것을 의미한다.

3. User Interactions

ViewController는 Responder 객체입니다. 직접 이벤트를 받아 처리하는것이 가능하나 일반적으로 지양합니다.
뷰가 그 자신의 터치 이벤트를 연관된 객체(보통 뷰컨트롤러)에 action 메서드나 delegate로 전달

4. Resource Management

ViewController가 생성한 모든 뷰와 객체들은 ViewContoller의 책임
UIViewController의 LifeCycle에 따라 생성되었다가 자동 소멸되기도 하지만 ARC 개념에 맞게 관리 필요
메모리 부족시 didReceiveMemoryWarning 메서드에서 캐시메모리 등 꼭 유지하지 않아도 되는 메서모리들은 정리 필요

5. Adaptivity

ViewController는 뷰의 표현을 책임지고, 현재 환경에 적절한 방법으로 적용되도록 할 책임을 가진다.
Imgur

The View Controller Hierarchy

The Root View Controller

UIWindow는 그 자체로는 유저에게 보여지는 콘텐츠를 가지지 못함.
Window는 정확히 하나의 RootViewController를 가지는데 이것을 통해 컨텐츠를 표현
Imgur

Container View Controller

Imgur

Presented View Controller

Imgur

View Controller Life Cycle

Imgur

각각의 뷰 컨트롤러는 자신만의 생명주기를 가지고 있고 이 생명주기를 잘 이해하고 있다면 뷰 컨트롤러의 상황에 따라 원하는 로직을 수행하도록 만들 수 있습니다.

  • ViewDidLoad - 해당 뷰컨트롤러 클래스가 생성될 때(ViewWillAppear전에 실행) 실행됩니다. Low memory와같은 특별한 경우가 아니라면 딱 한번만 실행되기 때문에 초기화 할 때 사용 할 수 있습니다.
  • ViewWillAppear - 뷰 컨트롤러가 화면에 나타나기 직전에 실행됩니다. 뷰 컨트롤러가 나타나기 직전에 항상 실행되기 때문에 해당 뷰 컨트롤러가 나타나기 직전마다 일어나는 작업들을 여기에 배치 시킬 수 있습니다.
  • ViewDidAppear - 뷰 컨트롤러가 화면에 나타난 직후에 실행됩니다. 화면에 적용될 애니메이션을 그리거나 API로 부터 정보를 받아와 화면을 업데이트 할 때 이곳에 로직을 위치시키면 좋습니다. 왜냐하면 지나치게 빨리 애니메이션을 그리거나 API에서 정보를 받아와 뷰 컨트롤러를 업데이트 할 경우 화면에 반영되지 않습니다.
  • ViewWill/DidDisappear - 뷰 컨트롤러가 화면에 나타난 직전/직후에 실행됩니다.