-
[iOS] ViewController Life Cycle (+ ViewIsAppearing)스위프트 2023. 9. 2. 16:58
Overview
ViewController에 새로운 viewIsAppearing(_:) 메소드가 추가되었습니다.
새로워진 ViewController의 생명 주기와 레이아웃은 어떤 방식으로 설정이 되는 지 알아봅시다.
ViewController Life Cycle
ViewController에도 생명 주기가 있습니다.
메모리에 적재되어 레이아웃을 잡고 사용자에게 시각적으로 보입니다.
그리고 더이상 필요 없다면 사라집니다.
init
잘 알고 있는 객체의 init 메소드입니다.
가장 먼저 호출이 됩니다.
loadView
ViewController가 관리하는 View를 만드는 메소드입니다.
View를 로드하거나 생성하여 View Property에 할당합니다.
애플 문서에 따르면 해당 메소드는 직접 호출하지 말라고 작성되어있습니다.
viewDidLoad
ViewController가 View 계층 구조를 메모리에 로드한 후 호출됩니다.
loadView 메소드를 통해 호출되었는지 nib 파일에서 로드되었는 지 관계없이 호출됩니다.
이 메소드를 override 하여 View에 대한 추가적인 설정을 할 수 있습니다.
viewDidLoad는 한 번만 호출되므로 초기 설정을 하기 좋은 메소드입니다.
viewWillAppear
ViewController의 View가 View 계층 구조에 추가될 예정임을 알리는 메소드입니다.
viewIsAppearing
(iOS 13.0 이상 그리고 Xcode 15 (작성일 기준 베타 버전) 에서 ViewController에 viewIsAppearing이라는 메소드가 추가되었습니다.)
ViewController의 View를 View 계층 구조에 추가하고 있음을 ViewController에게 알리는 메소드입니다.
viewDidAppear
ViewController의 View가 계층 구조에 추가되었음을 ViewController에 알리는 메소드입니다.
viewWillDisappear
ViewController의 View가 View 계층 구조에서 제거될 예정임을 알리는 메소드입니다.
viewDidDisappear
ViewController의 View가 View 계층 구조에서 제거되었음을 ViewController에 알리는 메소드입니다.
deinit
인스턴스가 메모리에서 해제될 때 호출되는 메소드입니다.
화면에 View를 표시하는 방법
애플 공식 문서에서는 viewIsAppearing(_:) 메소드에서 View에 대한 Content를 업데이트하라고 합니다.
- 이미 View는 View 계층 구조에 추가되어있기 때문
- frame, bounds, margin 그리고 inset이 정의되었기 때문
viewIsAppearing(_:) 메소드에 작성한 코드는 View가 화면에 처음 보여질 때 반영이 됩니다.
override func viewIsAppearing(_ animated: Bool) { super.viewIsAppearing(animated) print("🍏", #function) print("SafeAreaInsets:", view.safeAreaInsets, #function) print("ViewFrame:", view.frame, #function) print("SomeViewFrame:", someView.frame, #function) }
viewIsAppearing(_:) 메소드에서는 ViewController의 View와 ViewController의 여러 값들은 잘 반영이 되어있으나 SubView에 대한 값은 아직 반영이 되지 않음을 알 수 있습니다.
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() print("🍏", #function) print("SomeViewFrame:", someView.frame, #function) }
viewDidLayoutSubViews() 메소드를 통해 SubView에 대한 frame 값을 얻을 수 있습니다.
2개의 ViewController에서의 Life Cycle (NavigationController 사용)
ViewController의 생명 주기를 다시 살펴보면 위와 같습니다. (deinit이 빠져있군요)
초록색 ViewController 에서 붉은색 ViewController 로 이동하고 다시 돌아올 때 ViewController가 호출하는 메소드를 살펴봅시다.
초록색 ViewController (aka. GVC) 에서 붉은색 ViewController (aka. RVC)로 이동할 때를 살펴봅시다.
1. RVC가 init, loadView 그리고 viewDidLoad까지 진행된 후에 GVC의 viewWillDisappear 메소드가 호출됩니다.
2. RVC의 viewIsAppearing 메소드가 호출된 후에 GVC가 사라지고 RVC가 등장합니다.
3. RVC에서 GVC로 돌아올 때, RVC가 먼저 자신이 사라진다고 알린 후 GVC는 viewWillAppear, viewIsAppearing 메소드를 호출하게 됩니다.
4. RVC가 사라지고난 후 GVC는 나타나고 그 후 RVC는 deinit이 되어 메모리에서 해제됩니다.
마무리
간략하게 추가된 viewIsAppearing과 다른 메소드에 대해 살펴봤습니다.
viewIsAppearing 메소드가 한 번만 호출되는 줄 알았지만 여러 번 호출되더라구요. (viewWillAppear -> viewIsAppearing)
viewIsAppearing 에 초기 설정을 하면 다시 돌아왔을 때 초기 설정으로 돌아옵니다. 따라서 잘 확인하고 사용해야할 것 같아요.
읽어 주셔서 감사합니다.
참고
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621510-viewwillappear
https://developer.apple.com/documentation/uikit/uiviewcontroller/4195485-viewisappearing
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621423-viewdidappear
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621485-viewwilldisappear
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621477-viewdiddisappear
https://developer.apple.com/videos/play/wwdc2023/10055/?time=128
'스위프트' 카테고리의 다른 글
[iOS] 테스트를 작성해야 하는 이유 (0) 2024.01.21 [iOS] 모듈화를 해야 하는 이유 (0) 2024.01.14 [iOS] RxSwift를 이용하여 키보드 컨트롤하기 (NotificationCenter) (0) 2023.08.22 [Swift] 티스토리 블로그를 자동으로 Github에 업데이트 (Git Actions) (6) 2023.08.07 [iOS] Life Cycle (App, Scene 생명 주기) (0) 2023.07.30