본문 바로가기
iOS

View Life Cycle

by 융식 2022. 9. 6.

UIKit 을 이용하여 뷰를 만들 경우에는 뷰의 라이프 사이클을 인지하고 코드를 구성해야 

내가 원하는 타임에 뷰가 동작될 수 있습니다.

 

 

View Life Cycle이란?

View가 생성되고 사라지는 주기. View Controller는 생명주기를 가지고 있습니다.

 

 

여기서 부터 설명하는 것은 모두 코드로 View life cycle을 구현할 수 있습니다.

View Cycle 메소드를 호출 할 시 super를 호출해줘야합니다.

 

loadView

func loadView()
뷰 로드
뷰가 없을 시 호출, viewController가 관리하는 View를 만듦. View를 구성해 메모리에 올림
outlet과 action들이 이 때 생성되고 연결

loadView는 직접 코딩하여 view를 만드는 경우가 아니면 override를 하지 않는 것이 좋습니다.

 

 

viewDidLoad

func viewDidLoad()
뷰가 로드 됨
View가 메모리에 로드된 직후 호출 됨. View를 처음 그릴 때 이 메소드에서 작성

우리가 평소에 사용하던 것 처럼 처음 뷰가 로드될 때 실행됨. 메모리에 로드 후 한 번만 호출 됩니다.

 

 

viewWillAppear

func viewWillAppear(_ animated: Bool)
뷰가 나타날 것임
View가 화면에 나타날 거라고 알려줌. View가 화면에 나타나기 직전에 호출.

뷰가 나타날 때마다 반복적으로 작업. 따라서 메소드를 정의할 때 신중히 정의해야 함.

 

 

viewDidAppear

func viewDidAppear(_ animated: Bool)
뷰가 나타났음
뷰가 화면에 나타나고 난 후에 호출되는 메소드.

애니메이션을 실행시키거나, 비디오, 소리 등을 이때 수행하는 것이 좋음.

 

 

viewWillDesappear

func viewWillDisappear(_ animated: Bool)
뷰가 사라질 것임
뷰가 사라지기 전에 사라질 거라고 알리는 메소드

viewDidAppear에서 변경시킨 부분을 처음으로 돌릴 때 이 메소드를 이용.

 

 

viewDidDisappear

func viewDidDisappear(_ animated: Bool)
뷰가 사라졌음
뷰가 제거 되었음을 알리는 메소드

뷰가 제거 된 후에 호출됨. 알림이나 센서의 수신을 중지하려면 이때 작성.

 

 

실제로 확인하기 위한 코드 입력

 

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        print("1st View Did Load")
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        print("1st View Will Appear")
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("1st View Did Appear")
    }

    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("1st View Will Disappear")
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        print("1st View Did Disapper")
    }
    
}

// 2번째 뷰와 3번째 뷰(모달 뷰)도 동일

 

앱을 실행시켰을 시

첫번째 뷰를 로드한 후 나타났다는 메소드까지 호출었습니다.

 

두번째 뷰로 넘어갈 시

  1. 두번째 뷰를 로드하고
  2. 첫번째 뷰를 없앨거라는 알림을 주고
  3. 두번째 뷰가 나타날 거라는 알림을 주고
  4. 첫번째 뷰를 없앤 후 
  5. 두번째 뷰를 나타내 줍니다.

 

모달 뷰를 띄울 때는 어떨까요

모달 뷰는 다음 뷰로 넘어가는게 아닌 사용하던 뷰를 유지시키면서 새로운 뷰를 나타내는 것 이기 때문에

두번째 뷰를 없애지 않고 모달 뷰 만 나타나게 됩니다.

 

풀 스크린 모달 뷰는 어떨까요?

첫번째 뷰에서 두번째 뷰로 넘어갈 때와 같이

  1. 모달 뷰를 로드하고
  2. 두번째 뷰를 없앨거라는 알림을 주고
  3. 모달 뷰가 나타날 거라는 알림을 주고
  4. 모달 뷰가 나타난 후
  5. 두번째 뷰를 없애줍니다.

네비게이션 뷰의 사이클과  풀 모달 뷰의 사이클에 차이점이 있다면 

네비게이션 뷰의 경우 다음 뷰가 나타나기 전에 현재 뷰를 없애준 후 다음 뷰를 나타내 주는데,

풀 모달의 경우 풀 모달을 먼저 띄어준 후 보여주고 있던 뷰를 없애는 순서로 이루어져 있습니다.

 

 

뷰가 사라질 때를 알아 볼까요?

두번째 뷰에서 첫번째 뷰로 갈 때

  1. 두번째 뷰가 사라질 거라는 알림을 주고,
  2. 첫번째 뷰로 돌아갈 것이니 첫번째 뷰가 나타날 거라는 알림을 줍니다.
  3. 두번째 뷰가 사라지고,
  4. 첫번째 뷰가 나타났다는 메소드가 호출됩니다.

 

모달 뷰가 사라질 때는 어떨까요?

page sheet 형식같은 경우

 

기존에 있던 2번째 뷰는 그대로 두고 모달 뷰가 올라오는 형식이었으니

 

똑같이 올라왔던 모달뷰를 없애주었습니다.

 

 

그럼 full screen 의 경우는 어떨까요?

기본 네비게이션 뷰의 사이클 처럼 동작하는 것을 알 수 있습니다.

 

다른 점이 있다면 생성될 때와 비슷하게 2번째 뷰가 먼저 생기고 그 후에 모달 뷰가 사라지는 것을 알 수 있습니다.

 

 

첫번째 뷰는 처음 앱을 실행시켰을 때 만 view Did Load를 호출하고

 

그 이후의 뷰들은 다시 실행 시키면 그때마다 View Did Load를 호출시켜줍니다

 

 

왜 그럴까요?

우리가 사용하는 UINavigationController는 Stack의 형태로 구성돼있어 뷰가 쌓이게 됩니다.

 

그러면 2nd 뷰가 사라질 때 viewDidLoad되었던 것이 pop이 되게 되겠죠?

 

그에 비해 1st 뷰는 루트 뷰이기 때문에 완전히 종료되는게 아니면 pop이 되지 않습니다.

 

따라서 1st 뷰는 viewDidLoad를 재호출 하지 않는 것이고, 2nd 뷰를 다시 호출했을 때 viewDidLoad를 재 호출하게 됩니다.

 

정리 

뷰의 라이프 사이클은 뷰의 생성과 종료하는 어느 시점에서 내가 원하는 기능을 구현하기 위해 사용할 수 있다.

라이프 사이클을 모르고 내가 원하는 기능을 넣게 된다면 의도하지 않은 부분에서 기능이 작동할 수도 있으므로 필수적으로 알아야한다고 생각한다.

 

 

끝!

 

 

참고자료:

https://developer.apple.com/documentation/uikit/uiviewcontroller,

https://candost.blog/view-lifecycle-in-ios/

'iOS' 카테고리의 다른 글

AVCapture Session  (0) 2022.10.17
iOS ARKit LiDAR 에 대해  (0) 2022.09.27
Pencil Kit (iPadOS) - 기초편  (0) 2022.09.21
Watch Connectivity (watchOS)  (0) 2022.07.31
DispatchQueue, sync 와 async  (0) 2022.06.10