[번역] 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

모델-뷰-컨트롤러 디자인 패턴에서 뷰 컨트롤러의 역할은 모델 객체와 뷰 객체 간에 데이터의 이동을 촉진시키는 것이다. 뷰 컨트롤러는 임시 변수에 데이터를 저장하고 어떠한 검증을 수행할 수 있을 것이다. 하지만 주요 책임은 뷰가 정확한 정보를 포함하는 것을 보장하는 것이다. 데이터 객체는 실제 데이터를 관리할 책임이 있으며 데이터의 전체 무결성을 보장할 책임이 있다.

데이터와 인터페이스의 분리의 예는 UIDocumentUIViewController 클래스 간의 관계에 있다. 특히 둘 사이에는 디폴트 관계가 없다. UIDocument 객체는 데이터를 불러오고 저장하는 것을 코디네이트하는 반면, UIViewController 객체는 화면에 나타나는 뷰들의 표시를 코디네이트한다. 두 객체 간에 관계를 만든다면, 뷰 컨트롤러는 효율성을 위해 도큐먼트로부터 정보를 단지 캐싱하기만 해야 한다는 것을 기억하라. 실제 데이터는 여전히 도큐먼트 객체에 속해 있다.

Adapt to Changes

앱은 다양한 iOS 디바이스에서 실행 가능하며, 뷰 컨트롤러는 그러한 디바이스의 다른 크기를 가진 화면에 적응할 수 있도록 설계되었다. 다른 화면에 있는 컨텐트를 관리하기 위해 개별 뷰 컨트롤러를 사용하는 대신, 뷰 컨트롤러에서 크기와 사이즈 클래스 변화에 반응하기 위해 내장된 적응성 지원을 사용하라. UIKit이 보내는 노티피케이션은 뷰 컨트롤러 나머지의 코드를 변경하지 않고도 유저 인터페이스의 큰 변화와 작은 변화 모두를 할 수 있는 기회를 제공한다.

The Adaptive Model에서 적응성 변화를 처리하는 것과 관련된 더 많은 정보를 확인하라.