일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 개발후기
- enum
- 폰트
- flatMap
- ios13
- switch
- http
- 회고록
- dfs
- Firebase
- SF 폰트
- 알고리즘
- ios
- viewcontroller
- FSCalendar
- 프로그래머스
- Realm
- API
- optional
- LeetCode
- swipe
- struct
- typecasting
- SwiftUI
- Xcode
- RxSwift
- Crashlytics
- Lifecycle
- Swift
- TMDB
- Today
- Total
Jerry's Bakery
[iOS] ViewController Lifecycle(라이프사이클) 본문
안녕하세요 Jerry입니다.
ViewController과 Lifecycle에 대해서 알아보겠습니다.
iOS를 공부하면서 정리하는 것이기 때문에 미흡한 점이 있을 수 있습니다. 부족한 점에 대해 댓글 남겨주시면 감사하겠습니다.
우선 ViewController가 무엇인지에 대해 알아보겠습니다. 아래 Apple Document를 참고했습니다.
https://developer.apple.com/documentation/uikit/uiviewcontroller
ViewController란?
UIViewController 클래스는 모든 ViewController에 공통적인 공유 동작을 정의하는 클래스입니다. UIViewController 클래스의 인스턴스를 직접 만드는 경우는 거의 없고, 대신 UIViewController의 하위 클래스를 만들고 ViewController의 View 계층 구조를 관리하는 데 필요한 메서드와 속성을 추가하여 사용합니다.
Xcode에서 새 프로젝트를 생성하면 ViewController.swift 파일이 자동으로 생성됩니다. ViewController 클래스는 UIViewController 클래스를 상속받고, viewDidLoad 메서드가 오버라이딩 되었음을 확인할 수 있습니다.
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
}
ViewController의 책임은 다음과 같습니다.
- 일반적으로 기본 데이터 변경에 대한 응답으로 View의 내용을 업데이트합니다.
- View와 사용자 상호 작용에 응답합니다.
- View 크기 조정 및 전체 인터페이스 레이아웃을 관리합니다.
- 앱에서 다른 ViewController를 포함한 다른 오브젝트와 조정합니다.
View와 관련된 Notification 처리
View가 화면에 나타나거나 사라지는 것과 같이 상황이 변경되면 ViewController는 자동으로 자체 메서드를 호출하여 하위 클래스가 변경 사항에 응답할 수 있습니다.
아래 그림은 ViewController의 View에 대해 가능한 상태 전환을 보여줍니다. Disappeared, Appearing, Appeared, Disappearing 네 가지 상태가 있습니다. 화면이 변화함에 따라서 ViewController는 viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear 메서드를 호출하여 변화를 다른 클래스들이 반응할 수 있도록 합니다.
viewDidLoad
func viewDidLoad()
이 메서드는 새 프로젝트를 만들었을 ViewController.swift에 자동 생성되어 있는 메서드입니다.
View의 초기화를 수행할 때 사용하는 메서드입니다.
이 메서드는 ViewController가 View 계층 구조를 메모리에 로드한 후에 호출됩니다.
이 메서드는 View 계층 구조가 nib 파일에서 로드되었는지 또는 loadView() 메서드에서 프로그래밍 방식으로 생성되었는지 여부에 관계없이 호출됩니다. 일반적으로 이 메서드를 재정의하여 nib 파일에서 로드된 View에 대한 추가 초기화를 수행합니다.
viewWillAppear
func viewWillAppear(_ animated: Bool)
View가 View 계층에 추가될 것임을 ViewController에게 알릴 때 사용되는 메서드입니다.
이 메서드는 ViewController의 View가 View 계층에 추가되기 전과 View를 표시하기 위해 애니메이션이 구성되기 전에 호출됩니다.
viewDidLoad와의 차이점은 첫 번째 화면에서 두 번째 화면으로 이동했다가 다시 첫 번째 화면으로 돌아온다면 viewDidLoad 메서드는 이미 메모리에 로드되어있기 때문에 실행되지 않지만 viewWillAppear메서드는 실행됩니다.
viewDidAppear
func viewDidAppear(_ animated: Bool)
View가 View 계층에 추가되었음을 ViewController에게 알리는 데 사용되는 메서드입니다.
이 메서드는 View가 화면에 완전히 나타난 이후 호출됩니다.
viewWillDisappear
func viewWillDisappear(_ animated: Bool)
View가 View 계층에서 제거될 것임을 ViewController에게 알리는 데 사용되는 메서드입니다.
이 메서드는 View가 계층에서 사라지기 직전 호출됩니다.
viewDidDisappear
func viewDidDisappear(_ animated: Bool)
View가 View 계층에서 제거되었음을 ViewController에게 알리는 데 사용되는 메서드입니다.
View가 계층에서 사라졌을 때 이 메서드가 호출됩니다.
실습
ViewController Lifecycle 관련 메서드가 언제 호출되는지에 대해 실습을 통해 확인해보겠습니다.
아래 그림은 앱 전체 구조를 나타낸 것입니다. Lifecycle 메서드가 호출되는 것을 확인하기 위해 각 메서드를 오버라이딩 하여 호출된 메서드를 출력합니다.
코드는 아래와 같습니다. UIViewController 클래스의 메서드를 오버라이딩 하여 호출되는 메서드를 출력합니다.
class FirstViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("1: viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
print("1: viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("1: viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
print("1: viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("1: viewDidDisappear")
}
}
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("2: viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
print("2: viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("2: viewDidAppear")
}
override func viewWillDisappear(_ animated: Bool) {
print("2: viewWillDisappear")
}
override func viewDidDisappear(_ animated: Bool) {
print("2: viewDidDisappear")
}
}
앱을 실행했을 때 첫 번째 페이지 ViewController의 viewDidLoad -> viewWillAppear -> viewDidAppear 메서드가 순서대로 호출된 것을 확인할 수 있습니다.
그리고 두 번째 페이지로 이동 버튼을 클릭했을 때 두 번째 화면으로 전환되고, 첫 번째 페이지 ViewController의 viewWillDisappear -> viewWillDidAppear메서드가 호출되고, 두 번째 페이지 ViewController의 viewDidLoad -> viewWillAppear -> viewDidAppear 메서드가 호출된 것을 확인할 수 있습니다.
그리고 다시 뒤로 가기 버튼을 누르면 첫 번째 화면으로 전환되고, 두 번째 페이지 ViewController의 viewWillDisappear -> viewDidDisappear 메서드가 호출되고, 첫 번째 페이지 ViewController의 viewWillAppear -> viewDidAppear 메서드가 호출된 것을 확인할 수 있습니다.
'개발 > iOS' 카테고리의 다른 글
[iOS] Xcode13에서 HTTP 통신 사용하는 방법(Use HTTPS instead or add Exception Domains to your app's Info.plist.) (0) | 2021.10.25 |
---|---|
[iOS] enum과 switch (1) | 2021.10.19 |
[iOS] Optional(옵셔널), Optional Binding(옵셔널 바인딩), Optional Chaining(옵셔널 체이닝) (0) | 2021.10.19 |
[iOS] Swift Class와 Struct (0) | 2021.10.11 |
[iOS] iOS 13 이상 ViewController PopUpView 전체화면으로 변경하기 (0) | 2021.10.06 |