LifeCycle

betterhee 2022. 10. 28. 17:10

ViewController LifeCycle

1. None

// FirstViewController가 보여지는 경우
FirstViewController viewDidLoad()
FirstViewController viewWillAppear(_:)
FirstViewController viewDidAppear(_:)

// FirstViewController -> SecondViewController으로 present
SecondViewController viewDidLoad()
SecondViewController viewWillAppear(_:)
SecondViewController viewDidAppear(_:)

// SecondViewController -> FirstViewController으로 dismiss
SecondViewController viewWillDisappear(_:)
SecondViewController viewDidDisappear(_:)
SecondViewController deinit

2. FullScreen

// FirstViewController가 보여지는 경우
FirstViewController viewDidLoad()
FirstViewController viewWillAppear(_:)
FirstViewController viewDidAppear(_:)

// FirstViewController -> SecondViewController으로 present
SecondViewController viewDidLoad()
FirstViewController viewWillDisappear(_:)
SecondViewController viewWillAppear(_:)
SecondViewController viewDidAppear(_:)
FirstViewController viewDidDisappear(_:)

// SecondViewController -> FirstViewController으로 dismiss
SecondViewController viewWillDisappear(_:)
FirstViewController viewWillAppear(_:)
FirstViewController viewDidAppear(_:)
SecondViewController viewDidDisappear(_:)
SecondViewController deinit

3. OverFullScreen

// FirstViewController가 보여지는 경우
FirstViewController viewDidLoad()
FirstViewController viewWillAppear(_:)
FirstViewController viewDidAppear(_:)

// FirstViewController -> SecondViewController으로 present
SecondViewController viewDidLoad()
SecondViewController viewWillAppear(_:)
SecondViewController viewDidAppear(_:)

// SecondViewController -> FirstViewController으로 dismiss
SecondViewController viewWillDisappear(_:)
SecondViewController viewDidDisappear(_:)
SecondViewController deinit

FullScreen vs. OverFullScreen

None FullScreen OverFullScreen
default fullScreen overFullScreen
  • UIModalPresentationFullScreen 스타일을 사용하여 뷰 컨트롤러를 표시할 때 UIKit은 일반적으로 전환 애니메이션이 완료된 후 기본 뷰 컨트롤러의 뷰를 제거
  • UIModalPresentationOverFullScreen 스타일을 지정하면 해당 보기의 제거를 방지할 수 있음
    (Presented 뷰 컨트롤러에 Presenting 뷰 컨트롤러의 콘텐츠가 표시되는 transparent 영역이 있는 경우 해당 스타일을 사용)

viewDidLoad vs. viewWillAppear

  • viewDidLoad
    • 뷰 컨트롤러가 뷰 계층 구조를 메모리에 로드한 후에 호출됨
    • nib파일에서 로드된 뷰에 대한 추가적인 초기화를 수행하거나 스토리보드에 없는 뷰를 추가하고 구성하기
  • viewWillAppear
    • 뷰 컨트롤러의 뷰가 뷰 계층에 추가되기 직전에 호출됨
    • 뷰 컨트롤러가 화면에 나타날 때마다 발생해야 하는 작업들을 수행하기
      • ex) 자동 재생이 활성화된 경우 미디어 파일 재생을 시작
      • ex) trailCollection 변경으로 인한 레이아웃 재설정

App LifeCycle

An illustration showing the state transitions for a scene-based app. Scenes start in the unattached state and move to the foreground-active or background state. The foreground-inactive state acts as a transition state.

// Unattached -> Foreground Inactive
AppDelegate application(_:didFinishLaunchingWithOptions:)
SceneDelegate scene(_:willConnectTo:options:)
FirstViewController viewDidLoad()
FirstViewController viewWillAppear(_:)
SceneDelegate sceneWillEnterForeground(_:) 

// Foreground Inactive -> Foreground Active
SceneDelegate sceneDidBecomeActive(_:)
FirstViewController viewDidAppear(_:)

// Foreground Active -> Foreground Inactive 
SceneDelegate sceneWillResignActive(_:)

// Foreground Inactive -> Foreground Active
SceneDelegate sceneDidBecomeActive(_:)

// Foreground Active -> (Foreground Inactive) -> Background
SceneDelegate sceneWillResignActive(_:)
SceneDelegate sceneDidEnterBackground(_:)

// Background -> (Foreground Inactive) -> Foreground Active
SceneDelegate sceneWillEnterForeground(_:)
SceneDelegate sceneDidBecomeActive(_:)
Foreground Inactive Foreground Active
Foreground Inactive Foreground Active
Foreground Inactive (App Switcher) Background
Foreground Inactive (App Switcher) Background
Foreground Active (incoming phone call) Background (incoming phone call)
Foreground Active (incoming phone call) Background (incoming phone call)
Foreground Inactive ↔ Active (Lock screen) Foreground Inactive (Lock screen)
Foreground Inactive ↔ Active (Lock screen) Foreground Inactive (Lock screen)
Foreground Inactive ↔ Active (Lock screen - camera) Background (Lock)
Foreground Inactive ↔ Active (Lock screen - camera) Background (Lock)

참고