"Build your app’s user interface from view controllers, and change the currently visible view controller when you want to display new content."
뷰 컨트롤러로부터 앱의 UI를 빌드할 수 있으며, 새 컨텐트를 표시하길 원하는 시점에 현재 시각화된 뷰 컨트롤러를 변경할 수 있습니다.
앱 UI에서 각 씬은 윈도우 객체 및 하나 혹은 하나 이상의 뷰 객체를 포함합니다. 윈도우는 UI의 남은 부분에 대한 보이지 않는 컨테이너 역할을 하며, 뷰에 대한 상위 수준 컨테이너 역할을 하고, 뷰에 이벤트를 라우팅합니다. 뷰는 사용자가 스크린에서 볼 수 있는, 텍스트를 그리는 것, 이미지, 다른 커스텀 컨텐트 타입의 실제 컨텐트를 제공합니다. 윈도우는 주기가 긴 객체이며, 씬의 전체 UI를 떼어낼 때에만 해제할 수 있습니다. 반면에 해당 윈도우 내부에서 뷰는 빈번하게 변경할 수 있으며, 특히 새 컨텐트 혹은 정보를 표시하길 원할 때 그렇습니다.
뷰를 효과적으로 관리하고 윈도우로부터 뷸르 쉽게 추가 및 삭제하기 위해 UIKit
은 뷰 컨트롤러를 제공합니다. 뷰 컨트롤러는 앱에서 뷰의 단일 집합을 관리하며, 해당 뷰의 최신 상태로 정보를 유지합니다. 각 윈도우는 윈도우의 초기 뷰 집합을 구체화하기 위해 사용하는 루트 뷰 컨트롤러를 갖고 있습니다. 해당 뷰 집합을 변경하길 원하는 시점에서 UIKit
에게 추가적인 뷰 컨트롤러를 제공 혹은 해제할 것을 알려줄 수 있습니다. UIKit
은 하나의 뷰 집합으로부터 다른 집합으로 전환하는 것을 처리하며, 뷰 컨트롤러 객체를 통해 앱의 전체 인터페이스를 관리합니다. 뷰 컨트롤러는 UI 구현에서 중요한 역할을 합니다.
새 앱에 대한 UI를 디자인할 때 우선 해당 UI를 구분되는 페이지 컨텐트로 분해하시기 바랍니다. 각 페이지는 앱의 커스텀 정보를 표시하기 위해 고유한 방법을 나타냅니다. 예를 들어 하나의 페이지는 테이블에서 데이터의 행을 표시할 것이며, 다른 페이지는 그리드로 이미지를 표시하고, 다른 것은 데이터 캡처링을 위해 텍스트 필드의 집합을 표시할 것입니다. 각 페이지로부터 표시하려는 특정 데이터가 아니라 각 페이지의 구조 및 전반적 모양이 중요합니다. 사실 많은 앱이 여러 위치에서 같은 타입의 페이지를 사용하며, 여러 데이터 집합을 갖는 사본 각각으로 채웁니다.
각각의 구분되는 페이지에서 해당 페이지를 나타내기 위해, 그리고 뷰 컨트롤러의 상응하는 뷰를 관리하기 위해 뷰 컨트롤러를 정의하시기 바랍니다. 뷰 컨트롤러를 정의하는 것은 항상 서브클래싱과 커스텀 동작 추가에 관여합니다. 모든 뷰 컨트롤러는 아래 사항을 수행해야 합니다.
더 많은 정보는 Displaying and Managing Views with a View Controller를 보시기 바랍니다.
Displaying and Managing Views with a View Controller
https://developer.apple.com/documentation/uikit/view_controllers/displaying_and_managing_views_with_a_view_controller
https://velog.io/@panther222128/Displaying-and-Managing-Views-with-a-View-Controller
간단한 앱은 오직 하나의 스크린 컨텐트를 표시할 수 있지만, 대부분의 앱은 여러 스크린으로 컨텐트를 표시합니다. 해당 뷰 컨트롤러들 사이를 쉽게 탐색할 수 있도록 하기 위해 UIKit
은 일반적인 네비게이션 모델을 구현하는 컨테이너 뷰 컨트롤러를 제공합니다.
컨테이너 뷰 컨트롤러는 자식 뷰 컨트롤러라고도 알려진 다른 뷰 컨트롤러를 관리하는 뷰 컨트롤러의 특수한 타입입니다. 컨테이너의 역할은 가지고 있는 뷰의 bounds 내부에 각 자식 뷰 컨트롤러의 루트 뷰를 위치시키는 것입니다. 컨테이너는 한 번에 하나의 자식만 나타내거나 동시에 여러 자식을 나타낼 것입니다. 컨테이너는 네비게이션의 타입에 대한 시각적 피드백을 제공하기 위해, 자식의 뷰를 스크린에서 나타내거나 나타내지 않을 때 애니메이션 처리를 할 수도 있습니다.
일반적인 네비게이션 모델을 구현하려면 항상 UIKit
컨테이너 뷰 컨트롤러를 사용하시기 바랍니다.
UINavigationController
는 네비게이션 인터페이스에서 자식 뷰 컨트롤러를 갖는 스택을 관리합니다. 새 뷰 컨트롤러를 스택에 푸시하는 것은 이전 뷰 컨트롤러를 대체합니다. 뷰 컨트롤러를 팝하는 것은 아래에 있는 뷰 컨트롤러를 드러냅니다.UISplitViewController
는 스플릿 뷰 인터페이스에서 두 개의 자식 뷰 컨트롤러를 양 옆(공간이 사용 가능할 때)으로 관리합니다. (공간이 제약되는 경우 시스템은 네비게이션 인터페이스에서 해당 뷰 컨트롤러들을 표시합니다.) 이 타입의 인터페이스는 primary-detail 인터페이스라고 알려져 있기도 합니다.UITabBarController
는 탭바 인터페이스의 하단을 따라 버튼의 행을 표시합니다. 버튼을 선택하면 해당 버튼에 연결된 자식 뷰 컨트롤러를 표시합니다.UIPageViewController
는 순서가 있는 연속된 자식 뷰 컨트롤러를 관리하며, 페이징된 인터페이스에서 한 번에 오직 하나 혹은 둘을 나타냅니다. 사용자는 스와이프 혹은 탭을 통해 해당 뷰 컨트롤러들 사이를 탐색합니다.새로운 네비게이션 모델을 생성하기 위해 여러 UIKit
컨테이너 뷰 컨트롤러를 조합할 수 있습니다. 예를 들어 스플릿 뷰 인터페이스의 왼쪽 창(혹은 primary 창)에서 UINavigationController
을 위치시키는 것이 일반적인 경우입니다. 앱에서 고유한 새 네비게이션 모델을 생성할 수 잇도록 해주는 새 컨테이너 뷰 컨트롤러를 생성할 수도 있습니다.
컨테이너 뷰 컨트롤러와 더불어 어느 시점이더라도 현재 뷰 컨트롤러의 컨텐츠를 새 뷰 컨트롤러로 교체할 수 있습니다. 새 뷰 컨트롤러를 나타내는 것은 이전 뷰 컨트롤러의 전체 혹은 부분을 덮습니다. 보통 현재 흐름에서 일시적인 인터럽션으로 새 뷰 컨트롤러를 제시하거나 앱의 UI가 매우 간단할 때 새 뷰 컨트롤러를 제시합니다. 더 복잡한 네비게이션 스킴에서 뷰 컨트롤러들을 사용하지 않아야 합니다.
고유한 컨테이너 뷰 컨트롤러를 생성하는 방법에 대한 정보는 Creating a Custom Container View Controller를 보시기 바랍니다.
Creating a Custom Container View Controller
https://developer.apple.com/documentation/uikit/view_controllers/creating_a_custom_container_view_controller
https://velog.io/@panther222128/Creating-a-Custom-Container-View-Controller
루트 뷰 컨트롤러는 윈도우의 초기 네비게이션 모델을 정의합니다. 씬 기반 앱의 경우 루트 뷰 컨트롤러는 씬 스토리보드 파일의 초기 뷰 컨트롤러입니다. 윈도우를 코드 작성으로 생성하는 경우 윈도우를 보여주기 전에 rootViewController
속성으로 값을 할당하시기 바랍니다.
루트 뷰 컨트롤러가 컨테이너인 경우 해당 컨테이너에 의해 표시되는 모든 자식 뷰 컨트롤러를 설정해줘야 합니다. 대부분의 컨테이너 뷰 컨트롤러는 최소한의 UI를 제공합니다. 자식들은 컨텐트의 남은 부분을 제공합니다. 예를 들어 UISplitViewController
에 의해 제공되는 시각화된 유일한 컨텐트는 왼쪽과 오른쪽 뷰 컨트롤러 사이에 있는 구분선입니다.