[UIKit] appearance callbacks (화면 전환시 LifeCycle)
[UIKit] appearance callbacks (화면 전환시 LifeCycle)
기본적으로 UIKit에서 ViewController의 라이프 사이클은
위의 형태로 진행된다.
화면 전환
일반적인 경우 화면전환 과정에서 특별한 사용자의 액션이 없을 경우에는
(사용자의 액션이 없는 일반적인 경우)
> push: Disappeared에서 시작해서 Appearing과정을 따름.
> pop: Appeared에서 시작해 Disappearing과정을 따름.
(pop 과정 중 사용자의 인터렉션에 의해 취소된 경우)
-> 사용자가 화면을 팝하려고 하다가 놓은 경우 즉, viewWillDisappear과 viewDidDisAppear사이
이 경우에는 뷰가 바로 Disappeared 상태로 이동한 다음 사이클을 거치면서 다시 Appeared로 이동함.
✅ 즉, viewWillDisappear > (생략) viewDidDisAppear > viewWillDisappear > viewWillAppear > viewIsAppearing > viewDidAppear
(push 과정 중 사용자의 인터렉션에 의해 취소된 경우)
-> Disappeared에서 viewWillAppear > viewIsAppearing > 사용자의 인터렉션에 의한 취소
(뒤로가기나, 스와이프 등)
이 경우에는 푸시가 취소되지 않음. 대신 푸시가 즉시 완료 됨.
Appearing 사이클을 모두 타면서 Appeared로 이동.
대신 동일한 RunLoop에서 즉시 pop 전환이 수행되어 Disappeaing 사이클을 수행하면 Disappeared로 수정.
✅ 즉, 모든 사이클이 생략되지 않고 전부 돌게 됨.
Push를 취소하는 방법과 pop을 취소하는 방법을 다름.
이건 애플의 의도적인 설계임.
✅ 개념적으로 시스템은 중단된 푸시를 취소하지 않으며, 푸시는 항상 팝으로 변환됨.
푸시된 뷰 컨트롤러 관점에서 볼 때 항상 Appeared 상태에 도달함.
이는 시스템이 항상 호출하는 라이프 사이클의 전체 콜백 주기를 통해 실행됨 (모든 콜백 주기 받을 수 있음).
Tips for UIKit apps
화면 전환과 관련하여 UIKit에서의 몇가지 팁
화면 전환이 진행중이 경우 핸들러는 푸시를 호출할 수 없음.
> 상태에 관계없이 푸시를 호출하면 된다.
상태를 최소한으로 유지해야 다른 코드가 전환 상태에 종속될 가능성이 줄어 듦.
또한 객체를 메모리에서 정리해야하는 수고로움도 사라짐.
화면 전환 상태를 추적해야 하는 경우에는
viewDidAppear과 viewDidDisappear에서 처리하기.
전환이 끝날 때 호출되는 것이 보장됨.
이는 navigationController의 delegate에서 willShowViewController, didShowViewContoller 를 사용하는 경우에도 보장됨.
(참고)