# iOS | Swift

ViewController Life Cycle

jiniz.ll 2022. 1. 3. 22:01

■ VC 의 상태를 4 가지로 구분할 수 있다

Appearing : 뷰가 화면에 나타나고 있는 상태

Appeared : 뷰가 화면에 나타나는게 완료된 상태

Disappearing : 뷰가 화면에서 사라지고 있는 상태

Disappeared : 뷰가 화면에서 사라진 상태

■ VC 의 흐름은 다음과 같다고 할 수 있다

viewDidLoad
-> viewWillAppear
-> viewDidAppear
-> viewWillDisappear
-> viewDidDisappear

Life Cycle Method

— Managing the View

loadView()

■ 이 메소드를 절대 직접적으로 호출해서는 안됨

■ 컨트롤러가 관리하는 뷰를 만드는 역할을 함

뷰를 만들고 메모리에 올리는 과정

 

■ view 프로퍼티가 요청되었을 때 nil 이라면 VC가 이 메소드를 호출

■ 뷰를 로드/생성하고 view 프로퍼티에 할당함

 

■ 만약 VC 가 관련된 nib file 을 갖는다면, 이 메소드는 nib file 로부터 뷰를 로드함

■ 만약 nibName 프로퍼티가 non-nil 값을 반환한다면 VC는 관련 nib file 을 갖고 있는 것

VC 가 스토리보드에서 인스턴스화된 경우

init(nibName: bundle:) 메소드를 사용하여 명시적으로 nib 파일을 할당한 경우

iOS가 VC의 클래스 이름을 기반으로 하는 app bundle 에서 nib file을 발견한 경우

 

■ VC가 관련된 nib file 을 갖고 있지 않는다면, 이 메소드는 일반 UIView 객체를 대신 생성함

 

■ Interface Builder 를 통해 뷰를 생성하고 VC를 초기화하고자 한다면, 이 메소드를 override 해서는 안됨

■ 뷰를 수동으로 생성할 때는 이 메소드를 override 해도 됨

■ 이렇게 한다면 뷰 계층에서 root view 를 view 프로퍼티에 할당해야 함

■ 생성한 뷰는 고유한 인스턴스여야 하며 다른 VC 객체와 공유해서는 안됨

■ 이 메소드의 custom implementation(사용자 정의 구현)의 경우는 super를 호출해서는 안됨

■ 뷰에 대한 추가적인 초기화를 하고 싶다면 viewDidLoad() 메소드에서 구현하기

 

viewDidLoad()

■ VC가 해당 뷰 계층을 메모리에 로드한 후 호출

■ 이 메소드는 뷰 계층이 nib file로 부터 로드되었는지 loadView() 메소드를 통해 프로그래밍 방식으로 생성되었는지 여부에 관계없이 호출됨

■ 일반적으로 nib file 로 부터 로드된 뷰에 대해 추가적인 초기화를 할 때 override 를 함

■ 메모리에 처음 로드될 때 한 번만 호출됨

딱 한번 호출될 행위들을 이 메소드 안에 정의

 

■ 뷰와 관련된 추가적인 초기화 작업. 네트워크 호출 등

 

— Responding to View-Related Events

viewWillAppear()

■ VC의 뷰가 뷰 계층에 추가되고, 애니메이션이 구성되기 전에 호출됨

화면이 보여지기 직전에 호출됨

뷰가 뷰 계층에 추가되려 한다는 것을 VC에게 알림

 

■ 다른 뷰로 이동했다가 돌아오면 재호출 됨

 

■ 뷰와 관련된 추가적인 초기화 작업

orientation 을 변경하거나

방향에 맞게 조정하기 위해 status bar 의 스타일을 변경하거나

보여지는 뷰의 스타일을 변경할 때

 

viewDidAppear()

■ 뷰가 화면에 나타난 직후에 호출됨

뷰가 뷰 계층에 추가되었다는 것을 VC에게 알림

 

■ 뷰를 나타낼 때 필요한 추가 작업

■ 화면에 적용될 애니메이션을 그려줌

 

viewWillDisappear()

■ 뷰가 뷰 계층에서 실제로 사라지기 전에, 그리고 애니메이션을 구성하기 전에 호출됨

뷰가 뷰 계층에서 삭제 되려한다는 것을 VC에 알림

 

■ 뷰가 사라지기 전에 처리해야하는 작업들

editing changes 커밋하거나

뷰의 first responder 상태를 해지할 때

기타 관련 작업을 수행하는데 사용

최종적으로 데이터를 저장하는 작업

 

■ 뷰가 생성된 뒤 작업한 내용을 되돌리는 작업

뷰가 처음 보여질 때 viewDidAppear() 메소드에서 작업했던 status bar 의 방향이나 스타일을 다시 되돌리는 경우 등

 

viewDidDisappear()

■ 뷰가 뷰 계층에서 사라진 뒤에 호출

뷰가 뷰 계층에서 제거되었음을 VC에게 알림

 

■ 뷰가 사라지거나 숨는것과 관련된 추가 작업

 

Push vs. Present

Navigation Controller 를 사용해서 다음 화면이 push 되는 경우와 present 를 통해 화면을 띄우는 경우가 있는데 각각의 경우에 VC 의 생명주기와 관련된 메소드가 불리는 방식이 약간 차이가 있음!

 

Push

■ Navigation Controller 를 사용하게 되면 push 할수록 스택처럼 상단에 뷰가 쌓이는 형태를 갖는데

■ 다음 뷰를 push 하게되면 상단 뷰가 가려지기 때문에 VC 에서 viewWillDisappear 와 viewDidDisappear 가 호출되는 것을 확인 할 수 있음

■ 또한 다시 이전 화면으로 돌아가게 되는 경우에는 상단 뷰가 아래 남아있기 때문에 viewDidLoad 는 호출되지 않음!

 

Present

■ 위 그림처럼 일반적인 형태로 present 를 하게되면 이전 뷰 위에 겹쳐진것과 같은 모양을 하게됨

■ 그래서인지 present 를 하게되면 이전 뷰(VC) 가 disappear 되는 과정이 호출되지 않음

■ 그런데 present 형식을 Full Screen/Current Context 으로 설정하는 경우에는 뷰를 push 할 때와 동일하게 VC 가 disappear 되는 것이 확인됨 (뷰 계층에서 사라짐)

■ Over Full Screen/Over Current Context 의 경우는 VC가 disappear 되지 않음 (뷰 계층에서 사라지지 않음)

 

 

 

참고.

Apple Docs__ UIViewController

ViewController의 생명주기 — zeddios

Swift - View Controller Life Cycle (생명주기) :: 농부와 코

loadView – lyhonghwa Blog

iOS)  ViewController의 특징과 생명주

'# iOS | Swift' 카테고리의 다른 글

Hugging Priority vs. Compression Resistance Priority  (0) 2022.01.04