[번역] View Controller Programming Guide For iOS - Overview - Design Tips
미리 요약
- 다양한 프레임워크에서 기본 동작을 지원하기 위한 기본 컨테이너 뷰 컨트롤러를 가지고 있다.
- 각각의 뷰 컨트롤러는 서로를 몰라야 한다.
- 델리게이트 패턴 등을 사용하여 서로 모르도록 한다.
- 뷰 컨트롤러의 루트 뷰는 다른 커스텀 뷰들의 공통 부모 뷰가 되도록 해야 한다.
- MVC에서 뷰 컨트롤러는 모델와 뷰 간의 데이터 이동을 관리한다.
뷰 컨트롤러는 iOS에서 동작하는 앱의 필수 도구이며, UIKit의 뷰 컨트롤러 인프라는 많은 코드를 작성하지 않고 세련된 인터페이스를 쉽게 만들 수 있게 해준다. 뷰 컨트롤러를 구현할 때 다음의 팁과 가이드라인을 준수하여 시스템이 기대하는 자연 동작을 간섭하는 것을 하지 않는 것을 보장하라.
Use System-Supplied View Controllers Whenever Possible
많은 iOS 프레임워크는 앱에서 있는 그대로 사용 가능한 뷰 컨트롤러를 정의한다. 이러한 시스템이 제공하는 뷰 컨트롤러를 사용하여 시간을 절약하고 유저에게 일관된 경험을 제공하는 것을 보장할 수 있다.
대부분의 시스템 뷰 컨트롤러는 특정 작업을 위해 고안되었다. 몇몇 뷰 컨트롤는 연락처와 같은 유저 데이터에 대한 접근을 제공한다. 다른 것들은 하드웨어에 대한 접근이나 미디어를 관리하기 위해 특별히 조정된 인터페이스를 제공할 수 있다. 예를 들어 UIKit의 UIImagePickerController
클래스는 사진과 비디오를 촬영하고 유저의 카메라 롤에 접근하기 위한 표준 인터페이스를 표시한다.
커스텀 뷰 컨트롤러를 만들기 전에 수행하기 원하는 작업을 위한 뷰 컨트롤러가 이미 존재하는지 확인하기 위해 존재하는 프레임워크를 살펴보라.
- UIKit 프레임워크는 얼러트, 사진 및 비디오 촬영, iCloud 파일 관리를 위한 뷰 컨트롤러를 제공한다. 또한 컨텐트를 조직하기 위해 사용할 수 있는 많은 표준 컨테이너 뷰 컨트롤러를 정의한다.
- GameKit 프레임워크는 매칭 중인 플레이어와 리더보드, 업적, 다른 게임 특징을 위한 뷰 컨트롤러를 제공한다.
- Address Book UI 프레임워크는 연락처 정보를 표시하고 고르기 위한 뷰 컨트롤러를 제공한다.
- MediaPlayer 프레임워크는 비디오를 재생하고 관리하며, 유저 라이브러리에서 미디어 에셋을 선택하기 위한 뷰 컨트롤러를 제공한다.
- EventKit UI 프레임워크는 유저의 달력 데이터를 표시하고 편집하기 위한 뷰 컨트롤러를 제공한다.
- GLKit 프레임워크는 OpenGL 렌더링 표면을 관리하기 위한 뷰 컨트롤러를 제공한다.
- Multipeer Connectivity 프레임워크는 다른 유저를 탐지하고 연결을 위해 그들을 초대하기 위한 뷰 컨트롤러를 제공한다.
- Message UI 프레임워크는 이메일과 문자 메세지를 작성하기 위한 뷰 컨트롤러를 제공한다.
- PassKit 프레임워크는 패스를 표시하고 Passbook에 추가하기 위한 뷰 컨트롤러를 제공한다.
- Social 프레임워크는 트위터, 페이스북, 다른 소셜 미디어 사이트에 메세지를 작성하기 위한 뷰 컨트롤러를 제공한다.
- AVFoundation 프레임워크는 미디어 에셋을 표시하기 위한 뷰 컨트롤러를 제공한다.
중요 : 시스템이 제공하는 뷰 컨트롤러의 뷰 계층을 절대 변경하지 마라. 각각의 뷰 컨트롤러는 뷰 계층을 소유하며 계층의 무결성을 유지해야 할 책임이 있다. 변화를 만드는 것은 버그를 만들어 내거나, 소유하는 뷰 컨트롤러가 올바르게 동작하지 못하게 할 수 있다. 시스템 뷰 컨트롤러의 경우 변경을 하려면 항상 뷰 컨트롤러의 공개적으로 사용 가능한 메소드와 프로퍼티에 의존하라.
관련 프레임워크의 레퍼런스 문서에서 특정 뷰 컨트롤러를 사용하는 것에 관한 정보를 확인하라.
Make Each View Controller an Island
뷰 컨트롤러는 항상 스스로 포함된 객체여야 한다. 어떠한 뷰 컨트롤러도 내부 동작이나 다른 뷰 컨트롤러의 뷰 계층을 알지 못해야 한다. 두 개의 뷰 컨트롤러가 서로 데이터를 주고받을 필요가 있는 경우, 항상 명백하게 정의된 공개 인터페이스를 사용하여 해야 한다.
델리게이션 디자인 패턴은 뷰 컨트롤러 간 커뮤니케이션을 관리하기 위해 빈번하게 사용된다. 델리게이션을 사용하면, 한 객체는 관련된 델리게이트 객체와 소통하기 위한 프로토콜을 정의한다. 관련 델리게이트 객체는 이 프로토콜을 준수한다. 델리게이트 객체의 정확한 타입은 중요하지 않다. 중요한 것은 그것이 프로토콜의 메소드를 구현하는 것이다.
Use the Root View Only as a Container for Other Views
뷰 컨트롤러의 루트 뷰를 나머지 컨텐트의 컨테이너로 단독적으로 사용하라. 루트 뷰를 컨테이너로 사용하여 모든 뷰에 공통된 부모 뷰를 제공해야 하며, 이는 많은 레이아웃 동작을 더 간단하게 해준다. 많은 오토 레이아웃 제약들은 뷰를 적절하게 배치하기 위해 공통된 부모 뷰를 필요로 한다.
Know Where Your Data Lives
모델-뷰-컨트롤러 디자인 패턴에서 뷰 컨트롤러의 역할은 모델 객체와 뷰 객체 간에 데이터의 이동을 촉진시키는 것이다. 뷰 컨트롤러는 임시 변수에 데이터를 저장하고 어떠한 검증을 수행할 수 있을 것이다. 하지만 주요 책임은 뷰가 정확한 정보를 포함하는 것을 보장하는 것이다. 데이터 객체는 실제 데이터를 관리할 책임이 있으며 데이터의 전체 무결성을 보장할 책임이 있다.
데이터와 인터페이스의 분리의 예는 UIDocument
와 UIViewController
클래스 간의 관계에 있다. 특히 둘 사이에는 디폴트 관계가 없다. UIDocument
객체는 데이터를 불러오고 저장하는 것을 코디네이트하는 반면, UIViewController
객체는 화면에 나타나는 뷰들의 표시를 코디네이트한다. 두 객체 간에 관계를 만든다면, 뷰 컨트롤러는 효율성을 위해 도큐먼트로부터 정보를 단지 캐싱하기만 해야 한다는 것을 기억하라. 실제 데이터는 여전히 도큐먼트 객체에 속해 있다.
Adapt to Changes
앱은 다양한 iOS 디바이스에서 실행 가능하며, 뷰 컨트롤러는 그러한 디바이스의 다른 크기를 가진 화면에 적응할 수 있도록 설계되었다. 다른 화면에 있는 컨텐트를 관리하기 위해 개별 뷰 컨트롤러를 사용하는 대신, 뷰 컨트롤러에서 크기와 사이즈 클래스 변화에 반응하기 위해 내장된 적응성 지원을 사용하라. UIKit이 보내는 노티피케이션은 뷰 컨트롤러 나머지의 코드를 변경하지 않고도 유저 인터페이스의 큰 변화와 작은 변화 모두를 할 수 있는 기회를 제공한다.
The Adaptive Model에서 적응성 변화를 처리하는 것과 관련된 더 많은 정보를 확인하라.