https://bokch-jm.tistory.com/119 을 이어서 작성하는 글임!
iOS에서는 다양한 화면전환 방식이 있고, 이에 따라 생명주기 호출이 다르게 일어남.
그러면 이럴땐 어떻고 저럴땐 어떻고를 로그로 한 번 찍어보도록 하겠음
1. 모달방식 - 화면을 전체 다 덮지 않을 경우
Main viewWillAppear(_:)
Main viewDidAppear(_:)
일단 첫화면부터 어떤 함수가 호출될까를 생각해보겠음
탭바의 루트뷰이기 때문에 로드가 되어있는 상황임
viewDidLoad가 호출되지 않고, 그 이후의 함수들만 호출됨
그러면 탭바에 임베디드 되어있지 않고, 첫 화면이 보여지는 경우엔 어떤게 호출될까?
당연히 viewDidLoad부터 나옴
Main viewDidLoad()
Main viewWillAppear(_:)
Main viewDidAppear(_:)
모달로 띄워진 화면은 viewDidLoad부터 호출되는 것을 알 수 있음
Modal viewDidLoad()
Modal viewWillAppear(_:)
Modal viewDidAppear(_:)
그렇다면 모달을 잠깐 내렸다가 올려봄
두 화면에선 어떤 로그가 찍혔을까 확인해봄
살짝 내렸더니 viewWillDisapper가 찍혔고, 다시 올리니 viewWillAppear -> viewDidAppear 순으로 찍혔음
Modal viewWillDisappear(_:)
Modal viewWillAppear(_:)
Modal viewDidAppear(_:)
그러면 다 내려버리면 어떤 로그가 찍힐까.
여기서 알 수 있는 건 완전히 화면이 보이지 않을때가 되어서야 viewDidDisappear가 찍힌다는 걸 알 수 있음
Modal viewWillDisappear(_:)
Modal viewDidDisappear(_:)
근데 모달이 내려가던 다시 뜨던간에 Main이 로그가 안찍힘
이거 왜이러는건가요? viewWillAppear부터 다시 찍혀야하는거 아닌가요? 라고 처음에 생각했음..
지금 모달이 풀스크린 방식으로 띄워지지 않았기 때문에 밑에 화면이 계속 보여지고 있는 상태임
그렇기 때문에 메인의 로그는 그 어떤 것도 찍히지 않았던 것임.
그렇다면 풀스크린으로 띄우면 다르겠다 라고 유추할 수 있음
2. 모달방식 - 화면을 전체 다 덮을경우
첫화면 로드했을 때
Main viewDidLoad()
Main viewWillAppear(_:)
Main viewDidAppear(_:)
모달을 풀스크린으로 띄웠을 때
두 화면을 조합해서 보면
1) 첫화면에서 viewWillDisappear가 호출된 이후 -> 모달의 viewWillAppear가 호출됨
2) 모달에서 viewDidAppear가 호출된 이후 -> 메인의 viewDidDisappear가 호출됨
아까랑 다르게 풀스크린일 경우에는 Main의 생명주기 함수들이 호출되는 것을 알 수 있음
Modal viewDidLoad()
Main viewWillDisappear(_:)
Modal viewWillAppear(_:)
Modal viewDidAppear(_:)
Main viewDidDisappear(_:)
그럼 뒤로가기 버튼을 눌러서 첫번째 화면으로 돌아가면? 위와 전개가 비슷함
근데 첫번째 화면은 이미 로드된 상태니까 viewWillAppear부터 호출된다는게 다른점일 것 같음
Modal viewWillDisappear(_:)
Main viewWillAppear(_:)
Main viewDidAppear(_:)
Modal viewDidDisappear(_:)
3. 네비게이션 방식
첫화면만 띄웠을 때 당연히 viewDidLoad부터 차근차근 호출됨
Main viewDidLoad()
Main viewWillAppear(_:)
Main viewDidAppear(_:)
push해서 다음 화면이 보여질 때
Show viewDidLoad()
Main viewWillDisappear(_:)
Show viewWillAppear(_:)
Main viewDidDisappear(_:)
Show viewDidAppear(_:)
그럼 뒤로가보면 어떤 함수가 호출될까
첫번째 화면의 viewWillAppear가 먼저 호출될까 두번째 화면의 viewWillDisappear가 먼저 호출될까?
Show viewWillDisappear(_:)
Main viewWillAppear(_:)
Show viewDidDisappear(_:)
Main viewDidAppear(_:)
아까부터 실험해본 결과
1) viewWillDisappear가 먼저 호출되고 표시될 화면의 viewWillAppear가 호출
2) viewDidDisapper 그 이후 표시될 화면의 viewDidAppear가 호출
이것도 동일하게 동작하는 것을 확인할 수 있음
뷰컨트롤러의 생명주기를 실험을 통해 알아보았는데 네비게이션의 방식은 예상한 방식대로였지만
모달의 경우(풀스크린 or 시트) 생명주기 호출이 다르다는 것을 알 수 있었음
'iOS > iOS 지식' 카테고리의 다른 글
[Swift] Protocol(1) - (some과 any는 왜 필요할까?) (0) | 2024.10.07 |
---|---|
[Swift] Struct와 Class (1) - Class 안에 Class, Struct 안에 Class (0) | 2024.10.05 |
[iOS] GCD Priority Inversion (우선 순위의 뒤바뀜) (0) | 2024.08.03 |
[iOS] 네트워크 연결 감지 해보기 (0) | 2024.08.03 |
[WWDC2020] Advances in UICollectionView (0) | 2024.07.19 |