안녕하세요, iOS 개발하는 루피입니다.
오늘은 공식문서를 바탕으로 VC의 계층에 대해 정리해보는 시간을 가져보겠습니다.
바로 시작하겠습니다.
VC의 계층구조는 앱의 VC들 간의 관계를 정의하며, 각 VC가 수행해야 할 동작을 결정합니다.
UIKit은 VC를 특정 방식으로 사용하도록 요구하며, 올바른 VC 관계를 유지해야 필요한 자동 동작이 적잘한 VC에 전달 됩니다. 만약 정해진 Containment 와 Presentation 관계를 깨뜨리면, 앱의 일부 기능이 의도한 대로 작동하지 않을 수 있다.
- 자동 동작 : 화면 전환, View 업데이트 등
- Containment : VC 간의 부모-자식 관계를 설정하여 하나의 VC가 다른 VC를 포함하도록 하는 구조
- Presentation : 한 VC가 다른 VC를 모달 방식으로 표시하는 것
The Root View Controller
VC 계층 구조의 중심 역할을 합니다.
모든 Window는 하나의 루트 Root VC를 가지며, 이 컨트롤러의 콘텐츠가 Window를 채웁니다. Root VC는 사용자가 처음 보게 되는 초기 화면을 정의합니다. Window 자체는 표시 가능한 콘텐츠가 없기 때문에, Root VC의 뷰가 모든 콘텐츠를 제공합니다.
Root VC는 UIWindow 객체의 rootViewController 속성을 통해 접근할 수 있습니다. 스토리보드를 사용해 뷰 컨트롤러를 구성하는 경우, UIKit이 앱 실행 시 이 속성의 값을 자동으로 설정합니다. 하지만 프로그래밍 방식으로 윈도우를 생성하는 경우, 개발자가 직접 루트 뷰 컨트롤러를 설정해야 합니다.
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
let window = UIWindow(windowScene: windowScene)
window.rootViewController = MyViewController() // Root VC 설정
self.window = window
window.makeKeyAndVisible()
}
Container View Controllers
더 관리하기 쉽고 재사용 가능한 구성 요소들로 복잡한 인터페이스를 구성할 수 있게 해줍니다. Container VC는 하나 이상의 자식 VC의 콘텐츠를 결합하고, 필요에 따라 커스텀 뷰를 추가하여 최종 인터페이스를 만듭니다.
예를 들어, UINavigationController는 자식 뷰 컨트롤러의 콘텐츠를 표시하면서 네비게이션 바와 선택적으로 툴바를 함께 보여주는데, 이 바들은 네비게이션 컨트롤러가 관리합니다. UIKit에는 UINavigationController, UISplitViewController, UIPageViewController와 같은 여러 Container VC가 포함되어 있습니다.
컨테이너 뷰 컨트롤러의 뷰는 항상 할당된 공간을 채웁니다. 이러한 컨테이너는 Window의 Root VC로 자주 사용되지만, 모달로 표시되거나 다른 컨테이너의 자식으로도 설치될 수 있습니다. 컨테이너는 자식 뷰들을 적절히 배치하는 책임을 집니다. 그림에서는 컨테이너가 두 개의 자식 뷰를 나란히 배치하고 있습니다. 특정 컨테이너의 인터페이스에 따라 다르지만, 일반적으로 자식 뷰 컨트롤러는 자신을 포함하는 컨테이너나 형제 뷰 컨트롤러에 대해 최소한의 정보만 가지고 있습니다.
Container VC는 자식 VC를 관리하기 때문에, UIKit은 커스텀 컨테이너를 구현할 때 자식 VC를 설정하는 방법에 대한 규칙을 정의하고 있습니다.
참고
- 커스텀 Container VC를 만드는 방법에 대한 자세한 정보는 “Implementing a Container View Controller” 문서를 참고하세요.
Presented View Controllers
VC 를 present 하면 현재 VC 의 콘텐츠가 새로운 뷰 컨트롤러의 콘텐츠로 대체되며, 보통 이전 뷰 컨트롤러의 콘텐츠는 숨겨집니다. 프레젠테이션은 주로 새로운 콘텐츠를 모달 방식으로 표시할 때 사용됩니다.
예를 들어, 사용자로부터 입력을 받기 위해 VC 를 표시할 수 있습니다. 또한, 앱 인터페이스의 일반적인 구성 요소로도 활용할 수 있습니다. VC를 표시하면 UIKit은 표시하는 뷰 컨트롤러와 표시된 뷰 컨트롤러 간에 관계를 생성합니다. 이와 함께, 표시된 뷰 컨트롤러에서 표시한 뷰 컨트롤러로의 역방향 관계도 형성됩니다. 이러한 관계는 뷰 컨트롤러 계층 구조의 일부를 이루며, 런타임 시 다른 뷰 컨트롤러를 찾는 방법을 제공합니다.
Container VC 가 포함된 경우, UIKit은 개발자가 작성해야 할 코드를 단순화하기 위해 프레젠테이션 체인을 수정할 수 있습니다. 프레젠테이션 스타일마다 화면에 표시되는 방식에 대한 규칙이 다릅니다. 예를 들어, 풀 스크린 프레젠테이션은 항상 화면 전체를 덮습니다.
VC를 표시할 때 UIKit은 프레젠테이션에 적합한 컨텍스트를 제공하는 VC를 찾습니다. 대부분의 경우, UIKit은 가장 가까운 Container VC를 선택하지만, Window의 Root VC를 선택할 수도 있습니다. 특정 상황에서는 어떤 VC가 프레젠테이션 컨텍스트를 정의하고 이를 처리할지 직접 지정할 수도 있습니다.
그림은 왜 컨테이너가 주로 프레젠테이션을 위한 컨텍스트를 제공하는지 보여줍니다. 풀 스크린 프레젠테이션을 수행할 때, 새로운 VC는 화면 전체를 덮어야 합니다. 자식 뷰 컨트롤러가 컨테이너의 경계를 알 필요 없이, 컨테이너가 프레젠테이션을 처리할지 여부를 결정합니다. 예시에서 네비게이션 컨트롤러는 화면 전체를 덮기 때문에, 프레젠팅 VC 역할을 하며 프레젠테이션을 시작합니다.
오늘도 화이팅입니다!
'iOS > UIKit' 카테고리의 다른 글
[UIKit] View Controller의 역할 (0) | 2025.01.14 |
---|---|
[UIKit] Container View Controller (0) | 2025.01.12 |
[UIKit] ViewController의 생명주기 (0) | 2025.01.11 |
[UIKit] Preparing your UI to run in the foreground (0) | 2025.01.10 |
[UIKit] 공식문서로 App의 LifeCycle 관리에 대해 알아 보자구요 (0) | 2025.01.10 |