원문 링크: 클릭
- ViewController
- ViewController 계층
- Design Tips
View 계층 관리
데이터 마샬링(Data Marshaling)
유저 인터렉션(User Interaction)
자원 관리(Resource Management)
적응성(Adaptivity)
UIViewController 클래스는 View, Event Handling, Transition 등을 관리하기 위한 method와 property들이 정의돼 있으므로 (UIViewController를) 서브클래싱하여 추가적인 기능을 구현하면 된다.
Content ViewController
: 소유한 모든 View 를 직접 관리
Container ViewController
: 소유한 View + Child ViewControllers의 RootView 관리(정확히는 크기, 위치 조절)
Child ViewController의 Content에 대한 관리 책임은 각 Child ViewController 에게 있으며
Container ViewController는 오직 RootView 의 Sizing, Placing 만을 관리한다.
ex) Navigation Controller, Tabbar Controller
ViewController 의 가장 중요한 역할은 view 계층(hierarchy of views)을 관리하는 것
ViewController 는 모든 Content를 감싸는 하나의 root view 를 갖고 있고
해당 root view 에 display 하고 싶은 다른 view 들을 추가 할 수 있다
데이터 마샬링(Data Marshaling)?
: 객체의 메모리에서 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환
(출처: 위키백과 링크)
ViewController 는 View로부터의 Input을 검증하고
data objects 가 필요로 하는 포맷으로 패키징해서 Input을 전달
→ UIKit 의 객체들은 UIResponder를 상속 받아 Responder의 역할, 즉 이벤트에 응답하고 처리할 수 있다
ViewController 또한 responder chain으로부터 내려오는 이벤트를 핸들링 할 수 있지만 일반적으로 이를 직접 핸들링하기 보다는 view가 대신 이벤트를 감지하여 delegate method, action method 를 통해 핸들링된다.
ViewController 는 속한 view와 data에 대한 책임이 있는데
모든 iOS앱은 다양한 크기의 디바이스에서 일관성 있는 컨텐츠를 제공해야 한다.
이를 위해서 각 디바이스마다 다른 ViewController를 가지는 것보다는 디바이스의 크기에 따라 변화하는 하나의 ViewController를 사용하는 것이 더 간단하다.
이를 다른 화면 크기에 '적응'할 수 있다고 하여 적응성(Adaptivity)이라고 한다.
프레임, 오토리사이즈 마스크를 이용하는 방법도 있겠지만 일반적으로 오토레이아웃을 많이 사용한다.
UIWindow
UIWindow 자체는 시각적 content가 없고 view controller 의 view 가 모든 content를 제공한다.
이 때 사용자에게 보이는 첫 content 를 정의하는 ViewController가 Root view controller 이다.
스토리보드로 구현할 때는 UIKit 이 자동적으로 rootViewController 를 설정해주지만,
코드로 구현할 때는 아래와 같이 rootViewController를 직접 설정해줘야 한다.
Container ViewController를 사용하면
출처: JK님 학습자료
한 문장으로 요악하자면,
'복잡한 화면 구조를 컨테이너로 포함하거나 연결' 할 수 있다
UINavigationController는
present 하는 경우 presentedViewController
push 하는 경우 childViewControllers 를 가지게 됨 (navigation stack)
ViewController 간의 결합을 줄여야 하며 두 ViewController가 데이터를 주고 받아야 하는 경우 프로토콜을 정의하여 Delegate 패턴을 이용한다.
Root View 를 컨테이너로 사용하면 모든 View에 공통 상위 View가 생기게 되므로 레이아웃 작업, 특히 Autolayout 작업 시 간편해진다.
MVC 관계에서 특히 Data를 가지는 책임에 대한 내용으로, ViewController가 일부 임시 데이터나 캐시 데이터를 저장하거나 일부 검증을 할 수는 있지만 이의 주된 책임은 data objects, 즉 모델에게 있다.