티스토리 뷰

iOS/Swift

ViewController와 LifeCycle - 1, UIViewController

iOS 개발자, 였던 것 2023. 4. 16. 23:25

일일 포스팅의 첫 글로 당첨된 건 LifeCycle 관련 글이다, 공식 문서와 함께 공부해보자

Application LifeCycle도 있지만, 일단 오늘 다루려고 하는 건 ViewController의 LifeCycle이다.

처음 개발을 배울때 게임으로부터 시작해서인지, 특히 이쪽에 관심이 많이 있고 기본적으로 알아야하는 요소라고 생각했다.

업데이트와 렌더를 따로 관리했었는데, 업데이트만 하고 그려주지 않았다거나, 그려주긴 했는데 업데이트를 안시켰다거나, 했던 경험이


What is the View Controller?

LifeCycle을 다루기에 앞서, ViewController에 대해 알고 가보자

You use view controllers to manage your UIKit app’s interface. A view controller manages a single root view, which may itself contain any number of subviews. User interactions with that view hierarchy are handled by your view controller, which coordinates with other objects of your app as needed. Every app has at least one view controller whose content fills the main window. 


공식 문서에서 이야기하는 View Controller이다. UIKit 기반의 앱에서 인터페이스를 관리하기 위해 사용하며, 하나의 루트 뷰를 기준으로 하위에 깔리는 뷰들을 포함해 관리하는 역할을 한다고 한다. 뿐만 아니라 기본적으로 하나의 앱에는 최소 하나 이상의 View Controller가 있어야 화면이 구성된다고 하니, 모르고 개발하기는 어렵다고 할 수 있겠다.

 

앱을 신규 생성하면 만나는 코드, ViewController가 반갑게 맞이해주고 있다.

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

XCode로 Storyboard 기반의 어플리케이션을 만든다면, AppDelegate와 SceneDelegate를 제외하고 가장 먼저 만나는 코드에도 ViewController가 있다. SwiftUI의 경우 조금 다른 LifeCycle을 가지지만, 이는 추후에 다룰 예정이다.

 

위 코드에서도 볼 수 있듯, LifeCycle 중 제일 먼저 만나는 녀석도 viewDidLoad라는 메소드인데 친절하게 주석도 달려있다.

 

"Do any additional setup after loading the view"

 

직역하면, '화면이 로딩된 후 필요한 추가 설정 작업을 추가할 것' 으로 이 곳에서 ViewController가 로딩 된 후 연결될 것들 해당 화면에서 초기화가 필요한 요소들의 경우 보통 viewDidLoad에서 작업한다고 생각하면 된다. viewDidLoad의 경우는 ViewController가 생성되어서, 사라질 때 까지 한 번만 호출된다. 

 

이렇게 만들어지는 ViewController는 두 종류가 있는데, 공식 문서의 문장들을 인용하자면 다음과 같다.

- Content view controllers, manage a discrete piece of your app’s content and are the main type of view controller that you create. 
- Container view controllers, collect information from other view controllers (known as child view controllers) and present it in a way that facilitates navigation or presents the content of those view controllers differently.


화면 안에 그려지는 View들을 관리하며, 콘텐츠를 관리하는 Content view controllers와 이와 같은 ViewController들을 여럿 관리하는 Container view controllers가 있다. 전자의 경우 대표적으로 UIViewController, 후자는 UINavigationViewController가 되겠다.

이 외에도 정말 다양한 ViewController가 있지만, 모든 ViewController는 UIViewController를 상속받아서 만들어졌다는 사실.

 

UIViewController?

그 많은 ViewController의 부모 클래스, UIViewController는 뭘까?

The UIViewController class defines the shared behavior that’s common to all view controllers. You rarely create instances of the UIViewController class directly. Instead, you subclass UIViewController and add the methods and properties needed to manage the view controller’s view hierarchy.


그렇다고 한다. 즉, 모든 ViewController의 일반적인 동작을 정의하고 있는 ViewController이다. 일반적으로 UIViewController를 상속받아 만듦으로서 화면 구성이 시작된다고 할 수 있겠다.

 

애플에서는 UIViewController가 가지는 책임을 네 가지로 정의했는데, 1. 데이터를 기반으로 화면을 업데이트하고 2.사용자와의 상호작용을 하며, 3.화면의 크기를 조절할 뿐 아니라 4.다른 ViewController들과의 연결을 도와주는 역할을 한다.

또한, UIViewController는 UIResponder를 기본적으로 상속받아 발생하는 이벤트를 처리할 수 있도록 되어있기도 하다. UIResponder는 추후에 따로 다룰 예정이다.

 

이렇게 만들어진 UIViewController는 앱 내에서 중심 작업을 하는 요소가 되고, 그 중에서도 특히 하위에 들어오는 뷰들의 유일한 소유자가 되는데, 이는 한 UIViewController에서 만들어진 뷰를 다른 ViewController로 옮기지 못함을 의미하기도 한다.

 

ViewController 내의 View를 소유하고 보여지게 만들 뿐 아니라 크기를 관리하며 ViewController가 사라지는 시점에 소유권을 포기하게 되는 일련의 과정을 LifeCycle이라고 한다. UIKit 기반의 iOS Application에서는 "Handle view-related notification"라는 이름으로 만나 볼 수 있고, 메소드를 만들어두어 관리할 수 있도록 하고 있다.

 

 

UIViewController의 내용을 다 다루지 못했는데, 글이 꽤나 길어져 한 번 쉬었다가 가려고 한다.

다음 글에서는 viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear로 이어지는 UIViewController의 라이프 사이클과 애플에서 권장하는 UIViewController 개발하기에 대해 조금 다뤄볼 계획이다.

UIViewController LifeCycle, 다음 시간에 만나요

영어공부도 같이 할 겸 부족한 영어로 한땀 한땀 이해해보며 적는 만큼 시간은 꽤나 걸리지만, 그래도 뿌듯한 작업이었다고 할 수 있겠다. 부족한 글이지만, 읽어주셔서 감사합니다. 항상 잘못된 내용에 대한 지적은 감사히 받고 있습니다.

 

참고 문서, Xcode 14.2-14.3 기반의 문서를 보고 작성했습니다.

https://developer.apple.com/documentation/uikit/view_controllers

https://developer.apple.com/documentation/uikit/uiviewcontroller

https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/index.html#//apple_ref/doc/uid/TP40007457

'iOS > Swift' 카테고리의 다른 글

Swift에서의 Class와 Struct  (0) 2023.04.27
Swift, Equatable?  (0) 2023.04.21
Swift, Set 톺아보기  (0) 2023.04.18
ViewController와 LifeCycle - 2, LifeCycle  (0) 2023.04.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함