Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

일왓록(日What錄)

[UIKit]UIViewController LifeCycle: 공식 문서에 따른 이해 본문

iOS/UIKit

[UIKit]UIViewController LifeCycle: 공식 문서에 따른 이해

일왓 2024. 4. 11. 19:38

UIKit에서 View를 띄워주기 위해서 보통 UIViewController를 사용한다.

이 ViewController간의 전환이 일어나면서 뷰의 상태에 따라 일련의 과정이 있는데, 이 과정에 따라 메서드들이 호출되게 된다.

 

이를 우리는 보통 UIViewController의 생명주기라고 한다.

 

매우 기초적인 내용이지만 의외로 제대로 파헤쳐 보지 않은 상태로 개발을 진행하기도 한다.

필자도 그중 한명이라 취준중인 지금 시기에 정리를 해볼까 한다.


아마 블로그를 탐색하다 보면 해당 프로세스가 많이 보인다.

공식 문서에 올라와 있던 내용인 것으로 알고 있는데 필자가 글을 작성하는 시점에는 찾지 못했다.

 

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

필자가 공식 문서에서 찾은 View LifeCycle에 대한 정리는 다음과 같다. (일단은 loadView와 ViewDidLoad는 제외한 뷰의 라이프 사이클)

 

사실 필자가 글을 작성하는 시점에는 ViewIsAppearing이라는 새로운 메서드(라이프 사이클)가 추가 되어 도식이 변경된 것 같다.

 

사실 ViewWillAppear와 ViewDidAppear 사이에 ViewIsAppearing이 추가 된 것 이외에는 크게 다른 것이 없다.

 

일단 각각 메서드에 대해서 생명주기 순서대로 알아보자.


loadView

Controller가 관리하는 View를 생성하는 시점.

 

Controller는 자신이 가지고 있는 View 프로퍼티를 요청하는 시점에 해당 메서드를 호출하지만 실질적으로는 nil인 상태이다.

즉, View 프로퍼티를 load 또는 할당하면서 해당 메서드를 호출하는 것이다.

 

스토리보드(또는 nib파일)를 통해 뷰를 구성하는 경우 해당 메서드에서 nib파일로 부터 뷰를 생성하는 과정을 해당 메서드에서 진행한다.

 

공식 문서에는 이 메서드를 절대 직접적으로 호출하지 말라고 나와있다.

특히 스토리보드를 통해 해당 뷰를 생성하는 경우에는 더욱 하지 말라고 강조한다.

nib 파일을 불러오고 뷰로 생성하는 과정에서 문제가 생길 수 도 있기 때문으로 보인다.

 

만약 뷰를 수동적으로 변경하고자 하는 경우에는 해당 View를 다른 ViewController와 공유하지도 말고 super.loadView를 진행하지도 말라고 나와있다.

즉, 코드 베이스로 View를 구성하는 조건에서 Controller의 View를 바꾸기 위한 경우를 제외하고는 사용하지 않는 메서드이다.

 


ViewDidLoad

Controller의 뷰가 메모리에 로드되고 난 후에 불리어 지는 메서드.

일반적으로 가장 많이 사용하는 메서드이다.

 

Cocoa Touch Class를 통해 UIViewController를 생성했을 때,  Apple도 해당 메서드 내에 뷰가 로딩된 이후에 추가할 작업들을 해당 메서드에 구현하라고 권장한다.

 

 

코드 베이스, 스토리보드 모든 경우에 있어서 View가 메모리에 로드가 된 후 에 호출되는 메서드이다.


ViewWillAppear

뷰가 뷰 계층에 추가될 예정임을 뷰컨트롤러에 알리는 메서드

 

이 메서드는 뷰 컨트롤러의 뷰가 뷰 계층 구조에 추가되기 전과 뷰를 표시하기 위해 애니메이션이 구성되기 전에 호출됩니다. 
이 메서드를 재정의하여 보기 표시와 관련된 사용자 지정 작업을 수행할 수 있습니다. 예를 들어, 이 메서드를 사용하여 표시되는 보기의 방향이나 스타일에 맞춰 상태 표시줄의 방향이나 스타일을 변경할 수 있습니다. 이 메서드를 재정의하는 경우 구현의 어느 시점에서 super를 호출해야 합니다.

 

한마디로 뷰가 등장하려고 하는 시점에 호출되는 메서드이다.

해당 메서드에 뷰가 등장하려고 하는 시점의 동작을 추가할 수 있고, 이 메서드를 재정의 하는 경우 super.viewWillAppear를 호출해야한다.

 

※ 해당 메서드는 추후에도 다룰 예정이지만 pageSheet와 같은 popover 상태의 뷰가 띄워져 있는 상태에서 최상단 뷰를 Dismiss하여 이전 뷰를 띄우는 상황에서 이 메서드가 불려지지 않는다.


ViewIsAppearing

뷰가 뷰계층에 추가되고있음을 뷰컨트롤러에 알리는 메서드

 

한마디로 뷰가 등장하고 있는 시점에 호출되는 메서드이다.

새롭게 추가된 생명주기(메서드)로써 ViewWillAppear이 실행되고 나서 실행된다.

 

WWDC23에 새롭게 등장한 메서드인데, iOS 13.0 버전부터 사용이 가능하다.

 

왜 추가된걸까?

https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing

위에서 기술한 것 처럼, viewWillAppear는 뷰의 계층 구조가 추가되기도 전에 실행되기에 사실상 뷰의 trait collection 및 뷰의 크기, 뷰의 Geometry가 형성되기 이전이다.

그렇기에 뷰의 전환 시점에 trait collection, Size, Geometry를 활용한 코드를 작성하기에는 이른 시점이다.

 

하지만 그렇다고 viewDidAppear를 활용하기에는 뷰가 등장하고 나서이기 때문에 너무 늦은 시점이다.

 

이것이 viewIsAppearing의 필요성이다.

 

즉, viewIsAppearing은 뷰의 계층구조와 trait collection 까지 형성되고 나서 이를 기반한 뷰를 업데이트 하기 위한 코드를 작성하기에 최적화된 메서드인 것 이다.

공식 문서에서는 뷰 등장 시점에 CollectionView, TableView를 선택한 셀의 위치를 보이게 하는 코드를 작성할  수 있다고 예를 든다.

 

 

viewIsAppearing은 viewWillAppear와 같은 CATransaction에 실행된다.

그렇기 때문에 둘중 하나만 재 정의해도 원하는 결과를 도출해낼 수 있다.

하지만 두 메서드의 미세한 차이가 있으므로 이를 잘 생각해서 적절한 생명주기 메서드에 필요한 코드를 넣는 것이 중요하다.

https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing

 


viewDidAppear

뷰 컨트롤러에 뷰 계층구조에 뷰가 추가되었음을 알리는 메서드

 

뷰가 등장하고 나서 실행되는 메서드이다.

 

Popover 형태로 등장한 뷰 컨트롤러가 사라지는 상황에서 그 하위에 있는 뷰 컨트롤러는 해당 메서드가 실행되지 않는다.

이 부분은 추후 포스팅에서 더 알아보려고 한다.

 


viewWillDisAppear

해당 뷰가 뷰 계층 구조에서 제거될 예정임을 뷰 컨트롤러에 알리는 메서드.

 

해당 메서드는 뷰가 실제로 제거되기 전과 애니메이션이 구성되기 전에 호출된다.

 


viewDidDisAppear

해당 뷰가 뷰 계층 구조에서 제거되었음을 뷰 컨트롤러에 알리는 메서드.

 

이 메서드를 재정의하여 뷰의 dismiss 또는 사라지는 동작에 관련된 추가 작업을 수행할 수 있다.

 


 

 

공식 문서를 통해 살펴본 ViewController의 생명주기에 관한 설명은 이와 같았다.

 

나름 간단해 보이지만 실전에서 실행될때는 여러가지 상황이 존재하기 때문에 실제 사용하면서 어떻게 실행되는지를 살펴보는 것이 이해에 더큰 도움이 되었다.

 

그래서 이 다음으로는 실제 환경에서 어떻게 실행되는지에 대해 적어볼까 한다.

 

 

 

참고문헌

 

UIViewController | Apple Developer Documentation

An object that manages a view hierarchy for your UIKit app.

developer.apple.com

 

What’s new in UIKit - WWDC23 - Videos - Apple Developer

Explore enhancements and updates to UIKit and learn how to build better iOS, iPadOS, and Mac Catalyst apps. We'll show you the latest...

developer.apple.com

 

 

⚠️이 글은 필자가 공식문서를 중심으로 블로그 등을 통해 습득한 내용을 정리해보면서 다시 공부하는 글입니다. 개념을 습득하는 과정 중 잘못된 개념이 있을 수 있으니 그 점에 유의하시길 바라며, 잘못된 내용은 피드백을 해주시면 감사드리겠습니다.⚠️