[번역] View Controller Programming Guide for iOS - Overview - The Role of View Controllers

The Role of View Controllers

원문

미리 요약

  • 뷰 컨트롤러는 컨텐트 뷰 컨트롤러와 컨테이너 뷰 컨트롤러로 구분할 수 있다.
  • 뷰 컨트롤러는 뷰와 데이터를 관리하고 있으며, 데이터 관련 로직이 뷰 컨트롤러에 속하는 것을 최소화하여 책임을 분리해야 한다.

뷰 컨트롤러는 앱 내부 구조의 기반이다. 모든 앱은 적어도 하나의 뷰 컨트롤러를 가지고 있으며, 대부분은 여러 개를 가지고 있다. 각각의 뷰 컨트롤러는 앱의 유저 인터페이스의 일부분뿐만 아니라 인터페이스와 기반 데이터와의 인터랙션도 관리한다. 뷰 컨트롤러는 또한 유저 인터페이스의 다른 부분 간의 트랜지션을 촉진시킨다.

이들이 앱에서 그러한 중요한 역할을 맡기 때문에 뷰 컨트롤러는 하려는 거의 모든 것의 중심이 된다. UIViewController 클래스는 뷰를 관리하고, 이벤트를 처리하고, 뷰 컨트롤러를 다른 것으로 트랜지션하고, 앱의 다른 부분과 코디네이팅하는 메소드와 프로퍼티를 정의한다. UIViewController 또는 그 서브클래스를 서브클래싱하고 커스텀 코드를 작성하여 앱의 동작을 구현할 필요가 있다.

뷰 컨트롤러에는 두 가지 타입이 있다.

  • 컨텐트 뷰 컨트롤러는 앱 컨텐츠의 별개의 조각을 관리하며, 만드는 뷰 컨트롤러의 주요 타입이다.
  • 컨테이너 뷰 컨트롤러자식 뷰 컨트롤러라고 불리는 다른 뷰 컨트롤러에서 정보를 수집하여, 내비게이션을 촉진시키거나 뷰 컨트롤러의 컨텐트를 다르게 나타내는 방법으로 프레젠트한다.

대부분의 앱은 두 가지 종류의 뷰 컨트롤러를 혼합한다.

View Management

뷰 컨트롤러의 가장 중요한 역할은 뷰의 계층을 관리하는 것이다. 모든 뷰 컨트롤러는 모든 뷰 컨트롤러의 컨텐트를 포함하는 하나의 루트 뷰를 가지고 있다. 이 루트 뷰에서 컨텐츠를 표시하기 위해 필요한 뷰를 추가한다. 뷰 컨트롤러는 항상 루트 뷰에 대한 참조를 가지고 있으며 각 뷰는 그 서브뷰들에 대한 강한 참조를 가지고 있다.

알아두기 : 뷰 컨트롤러의 뷰 계층에 있는 다른 뷰들에 접근하기 위해 아울렛을 사용하는 것은 일반적인 관행이다. 뷰 컨트롤러는 모든 뷰들의 컨텐트를 관리하기 때문에 아울렛은 필요한 뷰들에 대한 참조를 저장할 수 있게 해준다. 아울렛 자체는 뷰가 스토리보드에서 로드될 때 자동으로 실제 객체와 연결된다.

컨텐트 뷰 컨트롤러는 그 자체가 모든 뷰들을 관리한다. 컨테이너 뷰 컨트롤러는 그 뷰들에 더하여 하나 이상의 자식 뷰 컨트롤러의 루트 뷰를 관리한다. 컨테이너는 자식의 컨텐트를 관리하지 않는다. 오직 루트 뷰만 관리하며, 컨테이너의 디자인에 따라 크기와 위치를 조절한다. 예를 들어 스플릿 뷰 컨트롤러는 자식 뷰의 전체 크기와 위치를 관리하지만, 자식 뷰 컨트롤러는 그러한 뷰들의 실제 컨텐트를 관리한다.

Managing View Layout에서 뷰 컨트롤러의 뷰를 관리하는 것에 관한 정보를 확인하라.

Data Marshaling

뷰 컨트롤러는 관리하는 뷰와 앱의 데이터 사이의 중재자 역할을 한다. UIViewController 클래승의 메소드와 프로퍼티는 앱의 시각적 표현을 관리할 수 있게 해준다. UIViewController를 서브클래싱할 때 서브클래스에서 데이터를 관리하기 위해 필요한 변수들을 추가한다. 커스텀 변수를 추가하여 데이터에 대한 참조와 데이터를 나타내기 위한 뷰에 대한 참조를 만들 수 있다. 그 둘 사이에서 데이터를 주고받는 것은 당신의 책임이다.

뷰 컨트롤러와 데이터 객체에서 책임 분리를 항상 확실하게 유지해야 한다. 데이터 구조의 무결성을 보장하는 대부분의 로직은 데이터 객체 자체에 속한다. 뷰 컨트롤러는 뷰에서 오는 입력을 검증하고 그 입력을 데이터 객체가 요구하는 포맷으로 포장할 수 있지만, 실제 데이터를 관리하는 것에 있어서 뷰 컨트롤러의 역할을 최소화해야 한다.

UIDocument 객체는 뷰 컨트롤러에서 데이터를 분리시켜 관리하는 한 방법이다. 도큐먼트 객체는 영속성 있는 저장소에서 데이터를 읽고 쓰는 방법을 알고 있는 컨트롤러 객체다. 서브클래싱할 때 데이터를 추출하고 그것을 뷰 컨트롤러나 앱의 다른 부분에 전달하기 위해 필요한 로직과 메소드 무엇이든 추가할 수 있다. 뷰 컨트롤러는 뷰 갱신을 더 쉽게 하기 위해 전달받은 데이터의 복사본을 저장할 수 있지만 여전히 도큐먼트가 진짜 데이터를 가지고 있다.

User Interactions

뷰 컨트롤러는 리스폰더 객체이며 리스폰더 체인을 통해 내려오는 이벤트를 처리할 능력이 있다. 그렇게 할 수 있을지라도, 뷰 컨트롤러는 거의 터치 이벤트를 직접 처리하지 않는다. 대신 보통 뷰가 그 자신에 대한 터치 이벤트를 처리하고 결과를 관련 델리게이트의 메소드나 타겟 객체에 보고한다. 그러므로 뷰 컨트롤러에서 일어나는 대부분의 이벤트는 델리게이트 메소드나 액션 메소드를 사용하여 처리된다.

Handling User Interactions에서 뷰 컨트롤러에서 액션 메소드를 구현하는 것에 관한 정보를 확인하라. Event Handling Guide for iOS에서 다른 타입의 이벤트들을 처리하는 것에 관한 정보를 확인하라.

Resource Management

뷰 컨트롤러는 그 뷰들과 만들어낸 객체들에 대한 모든 책임을 떠맡는다. UIViewController 클래스는 뷰 관리의 대부분의 양상을 자동으로 처리한다. 예를 들어 UIKit은 더이상 필요하지 않은 뷰와 관련된 리소스를 자동으로 릴리즈한다. UIViewController 서브클래스에서 명시적으로 만들어낸 객체를 관리하는 것은 당신의 책임이다.

사용 가능한 메모리가 적어질 때 UIKit은 더이상 필요하지 않는 리소스를 해제할 것을 앱에게 요청한다. 이를 하는 한 가지 방법은 뷰 컨트롤러의 didReceiveMemoryWarning() 메소드를 호출하는 것이다. 이 메소드를 사용하여 더이상 필요하지 않거나 나중에 쉽게 다시 만들어질 수 있는 객체에 대한 참조를 제거하라. 예를 들어 이 메소드를 사용하여 캐시된 데이터를 제거할 수 있을 것이다. 메모리가 적어진 상태가 발생할 때 가능한 한 많은 메모리를 릴리즈하는 것이 중요하다. 너무 많은 메모리를 소비하는 앱은 메모리를 복구하기 위해 시스템에 의해 완전하게 종료될 수 있다.

Adaptivity

뷰 컨트롤러는 뷰의 프레젠테이션에 대한 책임이 있고, 기반 환경과 맞추기 위해 그 프레젠테이션을 조절할 책임이 있다. 모든 iOS 앱은 iPad와 iPhone의 다른 크기들에서 작동할 수 있어야 한다. 각 디바이스마다 다른 뷰 컨트롤러와 뷰 계층을 제공하는 대신, 공간 요구사항을 변경하기 위해 뷰를 조절하는 하나의 뷰 컨트롤러를 사용하는 것이 더 간단하다.

iOS에서 뷰 컨트롤러는 거칠고 세부적인 변경을 처리할 필요가 있다. 거친 변경은 뷰 컨트롤러의 trait가 변화할 때 발생한다. Trait는 디스플레이 스케일과 같은 전체 환경을 나타내는 특성을 말한다. 가장 중요한 trait 중 두 개는 뷰 컨트롤러의 수평 및 수직 사이즈 클래스다. 이들은 주어진 치수에서 뷰 컨트롤러가 얼마나 많은 공간을 가지고 있는지 알려준다. 사이즈 클래스의 변화를 사용하여 뷰를 레이아웃하는 방법을 변경할 수 있다. 수평 사이즈 클래스가 레귤러일 때 뷰 컨트롤러는 컨텐트를 정렬하기 위해 여분의 수평 공간의 이점을 취할 수 있다. 수평 사이즈 클래스가 컴팩트일 때 뷰 컨트롤러는 컨텐트를 수직 방향으로 정렬할 수 있을 것이다.

주어진 사이즈 클래스에서 언제든지 더 세부적인 크기 변경이 일어날 수 있다. 사용자가 iPhone을 세로 방향에서 가로 방향으로 회전할 때 사이즈 클래스는 변화하지 않지만 보통 스크린 치수는 변화한다. 오토 레이아웃을 사용할 때 UIKit은 새로운 치수에 맞추기 위해 뷰의 크기와 위치를 자동으로 조절해준다. 뷰 컨트롤러는 필요하다면 추가적인 조절을 할 수 있다.

The Adaptive model에서 적응성과 관련된 더 많은 정보를 확인하라.