3.9 View Controller Life Cycle

Joohyun·2022년 4월 22일
0
  • view controller의 역할: view의 life cycle 관리
    • view의 생성을 관리
    • view의 life cycle 상태를 바탕으로 event 관리
    • view가 더이상 필요하지 않을 경우 삭제

View Controller Life Cycle

State

  • iOS에서 view controller는 5가지 상태를 갖는다.
    • View not loaded
    • View appearing
    • View appeared
    • View disappearing
    • View disappeared

Method

  • view의 상태가 변경될 때 마다, SDK에서 정의된 메서드가 호출된다.

    • viewDidLoad()
    • viewWillAppear(_:)
    • viewDidAppear(_:)
    • viewWillDisappear(_:)
    • viewDidDisappear(_:)
  • view가 로딩된 후, 메서드들은 "will" - "did" 짝을 이룬다. (standard Apple design pattern)

  • "will" callback 후에 "did" callback이 오지않을 수 있다.
    ex) viewWillDisappear(_:) 호출 후에 viewDidDisappear(_:)이 호출되지 않을 수 있다.

  • 사용 시, override 키워드와 내부에 super 키워드를 반드시 작성해주어야 한다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // Add your code here
}
  • superclass(UIViewController)에 이미 life cycle method들이 정의되어 있기 때문에, override 키워드를 통해 재정의가 필요하다.
  • UIViewController에 있는 life cycle method는 앱 동작에 필요한 필수적인 동작을 수행하므로, super 키워드를 통해 superclass의 method도 수행시켜야 한다.
  • 주로, superclass의 method는 재정의 된 method의 첫번째 줄에 호출된다.

1. View Did Load

  • viewDidLoad()

    • view controller가 계층에 추가될 때 UIKit는 해당 view가 로딩이 되어있지 않다면, view 로딩(view 생성 및 메모리에 적재)을 끝낸 후 viewDidLoad() 메서드를 호출한다.

    • view가 로딩될 때, 추가적으로 초기화할 동작들을 내부에 작성한다.
      ex) 네트워크 연결, 데이터베이스 접근 등

2. View Will Appear

  • viewWillAppear(_:)

    • viewDidLoad()가 호출된 후, view가 화면에 나타나기 직전에 호출된다.

    • view가 사용자에게 노출될 때마다 수행되어야 하는 동작을 내부에 작성한다.
      ex) 사용자의 위치와 관련된 정보를 보여주는 view - 사용자의 위치 검색, view 새로고침, 화면 방향에 의한 화면 조정

3. View Did Appear

  • viewDidAppear(_:)

    • view가 화면에 나타난 직후에 호출된다.

    • view가 사용자에게 노출될 때마다 수행되어야 하는 동작 중, 시간이 몇초이상 소요되는 동작들을 내부에 작성한다.
      (view가 먼저 빠르게 화면에 노출되도록 하기 위함)
      ex) 데이터 불러오기

4. View Will Disappear

  • viewWillDisappear(_:)

    • view가 화면으로부터 사라지기 직전에 호출된다.

    • 사용자가 back 버튼을 누르거나, tab을 전환하거나, modal 화면으로 넘어가거나, modal 화면을 없애는 등의 행위를 통해 user가 다른 view로 넘어가는 경우 수행된다.

    • 수정된 것을 저장하거나, 키보드를 숨기는 등의 동작을 작성한다.

5. View Did Disappear

  • viewDidDisappear(_:)

    • 새로운 view가 나타나면서 기존 view가 화면으로부터 사라진 직후에 호출된다.

    • 기존 view가 완벽히 사라진 후 method가 수행된다.

    • 기존 view와 관련된 서비스를 중지하는 코드를 작성한다.

Examples

1. tab bar controller를 통해 2개의 tab이 존재하는 앱

  • 앱 실행
// console
ViewController - View Did Load
ViewController - View Will Appear
ViewController - View Did Appear
  • 두번째 tab으로 이동
// console
SecondViewController - View Did Load
SecondViewController - View Will Appear
ViewController - View Will Disappear
ViewController - View Did Disappear
SecondViewController - View Did Appear
  • 다시 첫번째 tab으로 이동
// console
ViewController - View Will Appear
SecondViewController - View Will Disappear
SecondViewController - View Did Disappear
ViewController - View Did Appear

2. navigation controller를 통해 3개의 view가 존재하는 앱

  • navigation controller는 stack 형식으로 동작한다.

  • stack에 남아있는 view의 경우, 다시 화면에 나타날때 ViewDidLoad()가 호출되지 않는다.

  • 앱 실행
// stack: 1

ViewController - View Did Load
ViewController - View Will Appear
ViewController - View Did Appear
  • 2번째 view로 이동
// stack: 1 - 2

SecondViewController - View Did Load
SecondViewController - View Will Appear
ViewController - View Will Disappear
ViewController - View Did Disappear
SecondViewController - View Did Appear
  • 3번째 view로 이동
// stack: 1 - 2 - 3

ThirdViewController - View Did Load
ThirdViewController - View Will Appear
SecondViewController - View Will Disappear
SecondViewController - View Did Disappear
ThirdViewController - View Did Appear
  • 다시 2번째 view로 back
// stack: 1 - 2
// 2번째 view는 stack에 남아있었으므로 View Did Load가 수행되지 않는다.

SecondViewController - View Will Appear
ThirdViewController - View Will Disappear
ThridViewController - View Did Disappear
SecondViewController - View Did Appear
  • 다시 1번째 view로 back
// stack: 1
// 1번째 view는 stack에 남아있었으므로 View Did Load가 수행되지 않는다.

ViewController - View Will Appear
SecondViewController - View Will Disappear
SecondViewController - View Did Disappear
ViewController - View Did Appear
  • 다시 2번째 view로 이동
// stack: 1 - 2
// 2번째 view가 stack에 새로 추가되었기 때문에 View Did Load가 수행된다.

SecondViewController - View Did Load
SecondViewController - View Will Appear
ViewController - View Will Disappear
ViewController - View Did Disappear
SecondViewController - View Did Appear
profile
Developer

0개의 댓글