UIViewController의 개념과 상속관계에 대해 알아 보겠습니다.
The Role of View Controllers
앱 구조의 뼈대
모든 앱에 반드시 하나 이상, 대부분 많은 수의 ViewController구성
주요 역할
- View Management
- Data Marshaling
- User Interactions
- Resource Management
- Adaptivity
1. View Management
가장 중요한 역할 - 뷰 계층 관리
모든 뷰컨트롤러마다 RootView를 지니며, 화면에 표시하기 위해서는 해당 RootView 계층에 속해야 함
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간 중개 역할
marshal이란 단어는 사전에서 찾아보면 명사로 쓰일 때는 군대의 원수나 경찰서장, 법원의 집행관 등을 의미하고 , 동사로서는 (특정 목적을 위해 사람.사물.생각등을) 모으다, 결집시키다 라는 뜻과 (많은 사람들을) 통제하다 라는 뜻이 있다. 즉, 많은 것들을 모으거나 통제한다는 관리적인 개념의 단어라고 할 수 있다.
프로그래밍 언어에선 객체의 메모리 구조를 저장이나 전송을 위해서 적당한 자료형태로 변형하는 것을 의미한다.
3. User Interactions
ViewController는 Responder 객체입니다. 직접 이벤트를 받아 처리하는것이 가능하나 일반적으로 지양합니다.
뷰가 그 자신의 터치 이벤트를 연관된 객체(보통 뷰컨트롤러)에 action 메서드나 delegate로 전달
4. Resource Management
ViewController가 생성한 모든 뷰와 객체들은 ViewContoller의 책임
UIViewController의 LifeCycle에 따라 생성되었다가 자동 소멸되기도 하지만 ARC 개념에 맞게 관리 필요
메모리 부족시 didReceiveMemoryWarning 메서드에서 캐시메모리 등 꼭 유지하지 않아도 되는 메서모리들은 정리 필요
5. Adaptivity
ViewController는 뷰의 표현을 책임지고, 현재 환경에 적절한 방법으로 적용되도록 할 책임을 가진다.
The View Controller Hierarchy
The Root View Controller
UIWindow는 그 자체로는 유저에게 보여지는 콘텐츠를 가지지 못함.
Window는 정확히 하나의 RootViewController를 가지는데 이것을 통해 컨텐츠를 표현
Container View Controller
Presented View Controller
View Controller Life Cycle
각각의 뷰 컨트롤러는 자신만의 생명주기를 가지고 있고 이 생명주기를 잘 이해하고 있다면 뷰 컨트롤러의 상황에 따라 원하는 로직을 수행하도록 만들 수 있습니다.
- ViewDidLoad - 해당 뷰컨트롤러 클래스가 생성될 때(ViewWillAppear전에 실행) 실행됩니다. Low memory와같은 특별한 경우가 아니라면 딱 한번만 실행되기 때문에 초기화 할 때 사용 할 수 있습니다.
- ViewWillAppear - 뷰 컨트롤러가 화면에 나타나기 직전에 실행됩니다. 뷰 컨트롤러가 나타나기 직전에 항상 실행되기 때문에 해당 뷰 컨트롤러가 나타나기 직전마다 일어나는 작업들을 여기에 배치 시킬 수 있습니다.
- ViewDidAppear - 뷰 컨트롤러가 화면에 나타난 직후에 실행됩니다. 화면에 적용될 애니메이션을 그리거나 API로 부터 정보를 받아와 화면을 업데이트 할 때 이곳에 로직을 위치시키면 좋습니다. 왜냐하면 지나치게 빨리 애니메이션을 그리거나 API에서 정보를 받아와 뷰 컨트롤러를 업데이트 할 경우 화면에 반영되지 않습니다.
- ViewWill/DidDisappear - 뷰 컨트롤러가 화면에 나타난 직전/직후에 실행됩니다.
좀 더 자세한 Life Cycle:
기존에 애플에서 제공해준 Life Cycle이미지에는 없는 위의 Detail Life Cycle의 loadView가 viewDidLoad전에 불리우는걸 볼 수 있습니다. 이 loadView에 대해 간단히 설명 드리겠습니다.
- loadView - 화면에 띄어질 View를 만드는 메소드입니다. storyboard 나 .nib파일로 만들어지는 경우가 아닌 모두 직접적으로 코딩하여 만드는 경우를 제외하고서는 override하지 않는 것이 좋고. outlet들과 action들이 이 메소드에서 생성되고 연결됩니다.
'iOS' 카테고리의 다른 글
[iOS] 싱글턴(Singleton) in Swift (0) | 2019.07.23 |
---|---|
[iOS] Code Snippet (0) | 2019.07.23 |
[iOS] iOS UI Guide 개념 (0) | 2019.07.23 |
[iOS] 앱의 생명주기(App Life Cycle)와 앱의 구조(App Structure) (0) | 2019.07.23 |
[iOS] Hello Xcode (0) | 2019.07.22 |