[swift] ViewController의 Lifecycle
오늘도 Udemy 강의에서 배운 ViewController의 Lifecycle을 알아볼게요.
(Udemy 못 잃어,,,)
일단 ViewController의 life는 아래와 같이 돌아간다고 해요.
(역시 오타 안나면 내가 아니지,,,viewWillDisappear이에여 ㅎㅎㅎ)
하나씩 차근차근 알아볼게용 🤡
viewDidLoad()
- 우리가 익숙한 건 모다? viewDidLoad()져!
- view가 메모리에 로드된 후에 불려지는 인스턴스 메서드입니다.
- viewDidLoad()는 view가 생성될 때 딱 한 번 불려지게 됩니다.
viewWillAppear()
- viewDidLoad() 실행 후 불려지는 메서드에요.
- 뷰가 실제로 스크린에 나타나기 직전에 불려진답니다.
- 유저가 아직 아무것도 볼 수 없는 상태 -> 어떤 변화도 감지할 수 없기 때문에 특정 UI 구성 요소를 숨기거나 표시할 수 있는 좋은 시점이 될 수 있죠.
- 표시되는 뷰의 방향 또는 스타일에 맞게 status bar의 방향/스타일을 변경할 수 있어요.
- 이 메서드를 오버라이드 한다면, 반드시 super를 호출해야 합니당
viewDidAppear()
- 뷰가 이미 화면에 표시되고 사용자가 ViewController를 볼 수 있게되면 불리는 메서드에요.
- 뷰를 나타내는 것과 관련된 추가적인 작업들을 수행하기 위해 이 메서드를 오버라이드 해줍니다.
- 예를 들어, 화면에서 카운트다운 타이머를 시작하거나 사용자가 감지할 수 있는 애니메이션을 시작할 경우 좋은 시점입니다.
- 이 메서드를 오버라이드 한다면, 반드시 super를 호출해야 합니당
viewWillDisAppear()
- 뷰 계층에서 해당 뷰가 제거되려함을 뷰컨에게 알려줘요.
- 뷰가 제거되기 전, 애니메이션이 구성되기 전에 이 메서드가 불려져용.
- 예를 들어 애니메이션을 중지하고 UI 모양을 변경할 수 있습니다!
- 이 메서드를 통해 viewWillAppear에서 변경했던 status bar의 방향/스타일을 다시 되돌려놓을 수 있어요.
- 이 메서드를 오버라이드 한다면, 반드시 super를 호출해야 합니당
viewDidDisappear()
- 뷰가 화면에서 제거되었음을 뷰컨에게 알려줍니다. (이미 화면을 벗어났고 사용자가 볼 수 없음)
- 뷰를 숨기거나 안보이게 하는데 관련된 작업들을 수행하기 위해 이 메서드를 오버라이드 해요.
- 화면에서 사라지기 전에 이전 뷰에 대한 어떤 것도 바꿀 수 있는 마지막 순간이에요!
- 이 메서드를 오버라이드 한다면, 반드시 super를 호출해야 합니당
ㅎㅎ무슨 소리람,,,
저도 말로만 들었을 때는 이해가 안 갔지만, 아래 예제가 큰 도움이 되었어요!!
print를 사용하여 각 메서드가 언제 호출되었는지 확인해보겠슴돠
편의상 1번 뷰컨을 ①초록색, 2번 뷰컨을 ②주황색으로 불러볼게요!
처음에 ①초록색이 유저(It's me) 눈에 보였을 때, 아래 세개의 메서드가 실행된 걸 볼 수 있어요
/*
💚 1️⃣ viewDidLoad Called
💚 1️⃣ viewWillAppear Called
💚 1️⃣ viewDidAppear Called
*/
viewDidLoad → viewWillAppear → viewDidAppear 순서대로 호출이 됩니다.
그리고 Click 버튼을 누르면 ②주황색 뷰컨이 나타나져?!
그러면 위와 동일한 3개의 메서드가 또 나타납니당
둘 다 똑같이 뷰 계층에 추가가 되면서 해당 메서드들이 호출되는거죠!
/*
💚 1️⃣ viewDidLoad Called
💚 1️⃣ viewWillAppear Called
💚 1️⃣ viewDidAppear Called
🧡 2️⃣ viewDidLoad Called
🧡 2️⃣ viewWillAppear Called
🧡 2️⃣ viewDidAppear Called
*/
근데 다시 Back 버튼을 눌러서 ②주황색을 내려보면?
일부러 메서드의 호출을 보기 위해 천천히 내려봤어요.
②주황색 뷰컨이 화면에서 사라지고 있는 도중에는 viewWillDisAppear 메서드가 호출고, 완전히 사라지고 난 뒤에는 viewDidDisAppear 메서드가 호출되는 걸 알 수 있어요.
이렇게 보니까 시점이 잘 이해가 가더라구요!
근데 이 시점에서 쌤이 왜 ①초록색 뷰컨은 viewWillDisAppear, viewDidDisAppear가 호출되지 않는가? 라는 질문을 하시는데,,,
나 이해못했네,,,
왜일까요?
그건 segue 방식을 show로 했기 때문이래요.
②주황색 뷰컨를 보고 있을 때도 ①초록색 뷰컨이 뒤에 자리잡고 있기 때문에 뷰 계층에서 사라진 게 아니라는거져!!
그래서 show대신 present Modally의 Full Screen으로 프레젠테이션 방법을 바꿔보면?
우선 ①초록색 뷰가 로드되면서 아래 세개 메서드가 호출됩니다. (위와 동일)
/*
💚 1️⃣ viewDidLoad Called
💚 1️⃣ viewWillAppear Called
💚 1️⃣ viewDidAppear Called
*/
근데 이번에는 ②주황색 뷰컨이 ①초록색 뷰컨을 다 가려버리면서 ①초록색 뷰컨도 DisAppear되는 과정을 겪게 되는거죠.
아래처럼 ②주황색 뷰컨이 Appear되는 상황과 ①초록색 뷰컨이 DisAppear되는 상황이 동시다발적으로 일어나요!
/*
💚 1️⃣ viewDidLoad Called
💚 1️⃣ viewWillAppear Called
💚 1️⃣ viewDidAppear Called
🧡 2️⃣ viewDidLoad Called
💚 1️⃣ viewWillDisappear Called
🧡 2️⃣ viewWillAppear Called
🧡 2️⃣ viewDidAppear Called
💚 1️⃣ viewDidDisappear Called
🧡 2️⃣ viewWillDisappear Called
💚 1️⃣ viewWillAppear Called
💚 1️⃣ viewDidAppear Called
🧡 2️⃣ viewDidDisappear Called
*/
아!! 그리고 viewDidLoad는 오직 1번만 호출된다고 위에서 말했었져??
출력된 걸 잘 보시면 ①초록색 뷰컨과 ②주황색 뷰컨 모두 viewDidLoad는 한 번만 호출된 걸 알 수 있으니, 잊지 말기~
찡긋~
잘못된 부분이 있다면 따끔한 지적 부탁드립니다! 슨배님덜!