Overview

Young Min Sim ·2021년 1월 24일
0

원문 링크: 클릭

📜 Overview

  1. ViewController
  2. ViewController 계층
  3. Design Tips

1. ViewController

  • View 계층 관리

  • 데이터 마샬링(Data Marshaling)

  • 유저 인터렉션(User Interaction)

  • 자원 관리(Resource Management)

  • 적응성(Adaptivity)

  • UIViewController 클래스는 View, Event Handling, Transition 등을 관리하기 위한 method와 property들이 정의돼 있으므로 (UIViewController를) 서브클래싱하여 추가적인 기능을 구현하면 된다.


1-1 ViewController 의 종류 2가지

  • Content ViewController

    : 소유한 모든 View 를 직접 관리

  • Container ViewController

    : 소유한 View + Child ViewControllers의 RootView 관리(정확히는 크기, 위치 조절)

    Child ViewController의 Content에 대한 관리 책임은 각 Child ViewController 에게 있으며
    Container ViewController는 오직 RootView 의 Sizing, Placing 만을 관리한다.

    ex) Navigation Controller, Tabbar Controller


1-2 View 계층 관리

ViewController 의 가장 중요한 역할은 view 계층(hierarchy of views)을 관리하는 것

ViewController 는 모든 Content를 감싸는 하나의 root view 를 갖고 있고

해당 root view 에 display 하고 싶은 다른 view 들을 추가 할 수 있다


1-3. Data Marshaling

  • 데이터 마샬링(Data Marshaling)?

    : 객체의 메모리에서 표현방식을 저장 또는 전송에 적합한 다른 데이터 형식으로 변환

    (출처: 위키백과 링크)

ViewController 는 View로부터의 Input을 검증하고
data objects 가 필요로 하는 포맷으로 패키징해서 Input을 전달

  • 이를 MVC에 대입해서 해석해보면 View → ViewController → Model 까지 Input이 전달되는 절차를 Data Marshaling이라고 표현한 것
  • 이러한 과정에서 ViewController 에 과도한 책임을 부여하여 Massive한 ViewController를 만들지 않는 것이 중요

1-4. User Interaction

→ UIKit 의 객체들은 UIResponder를 상속 받아 Responder의 역할, 즉 이벤트에 응답하고 처리할 수 있다

ViewController 또한 responder chain으로부터 내려오는 이벤트를 핸들링 할 수 있지만 일반적으로 이를 직접 핸들링하기 보다는 view가 대신 이벤트를 감지하여 delegate method, action method 를 통해 핸들링된다.


1-5. Resource Management

ViewController 는 속한 viewdata에 대한 책임이 있는데

  • View: UIKit은 더 이상 사용하지 않는 view 관련 리소스를 릴리즈한다.
  • Data: 가용 메모리가 적을 때 didReceiveMemoryWarning 메서드를 통해 메모리가 부족함을 알림 받을 수 있고, 캐시 데이터를 삭제하는 식으로 메모리를 확보할 수 있다. 메모리를 확보하지 않는 경우 앱이 종료될 수 있다.

1-6. Adaptivity

  • 모든 iOS앱은 다양한 크기의 디바이스에서 일관성 있는 컨텐츠를 제공해야 한다.

  • 이를 위해서 각 디바이스마다 다른 ViewController를 가지는 것보다는 디바이스의 크기에 따라 변화하는 하나의 ViewController를 사용하는 것이 더 간단하다.

  • 이를 다른 화면 크기에 '적응'할 수 있다고 하여 적응성(Adaptivity)이라고 한다.

  • 프레임, 오토리사이즈 마스크를 이용하는 방법도 있겠지만 일반적으로 오토레이아웃을 많이 사용한다.


2. ViewController 계층

2-1 Root View Controller

UIWindow

  • 시각적 Content, 즉 뷰들을 담는 빈 컨테이너
  • APP의 뷰나 다른 객체에 터치 이벤트를 전달하는 역할 수행

UIWindow 자체는 시각적 content가 없고 view controller 의 view 가 모든 content를 제공한다.

이 때 사용자에게 보이는 첫 content 를 정의하는 ViewController가 Root view controller 이다.

스토리보드로 구현할 때는 UIKit 이 자동적으로 rootViewController 를 설정해주지만,

코드로 구현할 때는 아래와 같이 rootViewController를 직접 설정해줘야 한다.


2-2 Container View Controllers

Container ViewController를 사용하면

  • 복잡한 인터페이스를 더 관리하기 쉽고
  • 재사용이 가능하게 조합할 수 있다.
  • 뿐만 아니라 스토리보드로 협업 시 Container ViewController는 좋은 방법이 될 수 있다.



출처: JK님 학습자료

한 문장으로 요악하자면,
'복잡한 화면 구조를 컨테이너로 포함하거나 연결' 할 수 있다


2-3 Presented View Controllers

UINavigationController는

present 하는 경우 presentedViewController

push 하는 경우 childViewControllers 를 가지게 됨 (navigation stack)



  • NavigationController에 present 및 pushViewController 한 결과
    Container ViewController 인 NavigationController 로 Push 된 ViewControllerpresent된 ViewController는 위 그림과 같이 서로 다른 계층에 존재한다.

3. Design Tips

3-1 시스템에서 제공하는 ViewController 사용하기

  • 카메라 및 앨범에 접근할 필요가 있을 때 UIKit이 제공하는 UIImagePickerController 같은 시스템 제공 ViewController를 사용
  • 예시에는 없지만 AVKit 의 경우에도 iOS의 기본 재생 환경과 동일한 플레이어를 사용하고 싶은 경우AVPlayerViewController를 사용 (커스텀 하고 싶은 경우 AVFoundation의 AVPlayerLayer사용)

3-2 Make Each View Controller an Island

ViewController 간의 결합을 줄여야 하며 두 ViewController가 데이터를 주고 받아야 하는 경우 프로토콜을 정의하여 Delegate 패턴을 이용한다.

  • 프로토콜을 사용하는 이유
  1. 변경의 영향을 줄일 수 있다.
  2. 프로그래머의 실수를 줄일 수 있다.

3-3 Use the Root View Only as a Container for Other Views

Root View 를 컨테이너로 사용하면 모든 View에 공통 상위 View가 생기게 되므로 레이아웃 작업, 특히 Autolayout 작업 시 간편해진다.


3-4 Know Where Your Data Lives

MVC 관계에서 특히 Data를 가지는 책임에 대한 내용으로, ViewController가 일부 임시 데이터나 캐시 데이터를 저장하거나 일부 검증을 할 수는 있지만 이의 주된 책임은 data objects, 즉 모델에게 있다.

0개의 댓글

관련 채용 정보