앱이 실행되면서 여러 event들에 의해 화면이 나오고 사라지는데, 이 과정에서 View Controller가 만들어지고 사라지며 화면을 띄우고 내리는 작업을 수행한다.
네비게이션 컨트롤러의 동작은 자료구조에서의 '스택'과 같다. LIFO(Last In First Out) 방식 채택
뷰 컨트롤러에는 자신만의 생명주기가 존재한다. 뷰가 화면에 보여지는 상태의 변화나 뷰의 레이아웃의 변화가 생기면 뷰 컨트롤러는 그에 맞는 메소드를 호출한다.
뷰의 상태변화와 그에 따라 호출되는 메서드이다.
아래에서 자세히 알아보자.
-
View Controller의 생성자 메서드이다.
-
스토리보드냐 xib/코드냐에 따라 다른 것이 호출된다.
-
화면에 띄워 줄 뷰를 만드는 메서드로 뷰를 만들고 메모리에 로드한다.
-
일반적으로 사용자는 이 메서드를 직접 호출하면 안된다. 관련 설명
-
뷰 컨트롤러가 뷰 계층을 메모리에 로드한 뒤(loadView() 직후) 시스템에 의해 자동으로 호출된다.
-
메모리가 처음 로드될 때(즉, 화면이 처음 만들어질 때) 한 번만 호출된다. (메모리 경고로 뷰가 사라질 경우 제외)
-
뷰와 관련된 추가적인 초기화 코드가 있을 경우 이 메서드 내부에 작성한다.
viewDidLoad에서는 한 번 초기화 된 후 변하지 않는 내용에 관한 작업을 수행
viewWillAppear
-
뷰 컨트롤러의 Root View가 로드된 이후 Window의 뷰 계층으로 더해지기 직전에 호출되는 메서드이다.
-
다른 뷰로 이동했다가 다시 돌아오면 재호출되므로 그 때 필요한 코드는 이 메서드 내부에 작성한다.
viewWillAppear에서는 화면이 나타날 때마다 업데이트 해야 하는 내용에 관한 작업을 수행
viewDidAppear
-
Window의 Root View가 뷰 계층으로 더해진 직후 호출되는 메서드이다.
-
뷰가 나타났다는 것을 컨트롤러에게 알리는 역할을 하며, 화면에 적용될 애니메이션을 그려준다.
viewWillDisappear
-
Window의 Root View가 뷰 계층에서 제거되기 직전 호출되는 메서드이다.
-
뷰가 삭제되려고 하는 것을 뷰 컨트롤러에게 통지하며, 작업한 내용을 되돌리는 작업과 최종 데이터 저장 작업 등을 수행한다.
viewDidDisappear
-
Window의 Root View가 뷰 계층에서 제거된 직후 호출되는 메서드이다.
-
뷰가 제거되었음을 알려주며, 사라지는 것과 관련된 추가 작업, 마무리작업(리소스 해제 등)을 수행한다.
- View가 메모리에서 해제된 뒤 호출된다.
FirstViewController(이하 A 뷰컨)가 있고 “두 번째 뷰컨트롤러로 이동” 버튼을 눌렀을 때 SecondViewController(이하 B 뷰컨) 로 이동하고 B 뷰컨트롤러의 “닫기” 버튼을 눌러 A 뷰컨트롤러로 이동할 때 ViewController Life Cycle 메서드 호출 순서를 살펴보자.
처음 앱을 실행했을 때
- A 뷰컨의 ViewDidLoad
- A 뷰컨의 ViewWillAppear
- A 뷰컨의 ViewDidAppear
두 번째 뷰 컨트롤러로 이동 버튼을 누른 후
- B 뷰컨의 ViewDidLoad
- A 뷰컨의 ViewWillDisappear
- B 뷰컨의 ViewWillAppear
- B 뷰컨의 ViewDidAppear
- A 뷰컨의 ViewDidDisappear
B 뷰 컨트롤러에 닫기 버튼을 누른 후
- B 뷰컨의 ViewWillDisappear
- A 뷰컨의 ViewWillAppear
- A 뷰컨의 ViewDidAppear
- B 뷰컨의 ViewDidDisappear
NavigationController 에 RootViewController(이하 Root 뷰컨) 가 있고 TableView에 cell 을 눌러서 DetailViewController((이하 Detail 뷰컨)) 로 이동하고 NavigationBar 의 “Root View Controller” 버튼을 눌러 RootViewController 로 이동할 때의 ViewController Life Cycle 메서드 호출 순서를 살펴보자.
처음 앱을 실행했을 때
- NavigationController 의 ViewDidLoad
- NavigationController 의 ViewWillAppear
- Root 뷰컨의 ViewDidLoad
- Root 뷰컨의 ViewWillAppear
- Root 뷰컨의 ViewDidAppear
- NavigationController 의 ViewDidAppear
RootViewController 에 셀을 눌렀을 때
- Detail 뷰컨의 ViewDidLoad
- Root 뷰컨의 ViewWillDisappear
- Detail 뷰컨의 ViewWillAppear
- Root 뷰컨의 ViewDidDisappear
- Detail 뷰컨의 ViewDidAppear
DetailViewController 의 뒤로가기 버튼을 눌렀을 때
- Detail 뷰컨의 ViewWillDisappear
- Root 뷰컨의 ViewWillAppear
- Detail 뷰컨의 ViewDidDisappear
- Root 뷰컨의 ViewDidAppear
네비게이션 컨트롤러가 있을 때는 네비게이션 컨트롤러가 없을 때와 다르게 사라질 뷰가 먼저 ViewDidDisappear 가 호출되고 그 뒤에 나타날 뷰의 ViewDidAppear 가 호출되었다.
[ios] UIViewController Lifecycle
[ios] UIViewController LifeCycle - 추가
UIViewController: UIViewController