iOS App LifeCycle을 공부한 후에는 ViewController의 LifeCycle 그리고 오늘 알아볼 View LifeCycle이 궁금해진다.
View는 스토리보드, xib, code 방식으로 다양한 방법으로 생성될 수 있다.
접근 방식과는 별도로 View가 생성, 로드, 표시, 삭제되는 시점을 이해해야만 원하는 UI 디자인, 애니메이션 등의 작업이 가능해진다.
왜 알아야 할까?
App LifeCycle을 공부하면, App이 Background로 갔을 때, Suspend될 때, 다시 Foreground로 왔을 때 등등의 상황이 발생하는 것을 알 수 있다. 사용자가 앱을 이용하면서 작업 결과가 바뀌고, 저장되고 App State가 변경된다.
반면에 View에 특정 상태 전환이 있을 때, UI를 조작해야할 수도 있다.
ex) 가로모드와 세로모드 간의 차이가 있어야하고, 이 차이를 어느 "시기"에 수행해야 하는지 등
무엇을 알아야 할까?
적절한 위치에서 View를 사용하려면 View가 생성, 로드, 표시, 삭제, 종료 시점을 알아야 한다.
UIViewController의 SubClass는 View를 관리한다. 그리고 UIViewController의 rootView는 UIView이다.
VC는 UIView의 모든 마법을 처리하는 반면 UIView는 사용자에게 화면과 일부 컨텐츠를 나타낸다.
VC는 화면에 올 때, rootView에 알려준다.
먼저 VC는 rootView를 생성하고 로드한다. 로드 후에 View들이 나타나고 필요할 때 사라지도록 지시한다.
또한 VC는 다른 VC의 자식일 수도 있다. 따라서 VC의 LifeCycle은 rootView에 관심있을 뿐만아니라, 부모 VC로 이동했는지에 대한 다른 VC와의 관계도 포함한다.
마지막으로 rootView에는 자체 컨텐츠와 수명주기가 있다. rootView에는 버튼, 레이블, 스위치 등의 하위 View가 있다.
이런 하위 View의 수명주기를 보통 고려하지 않는다.
그러나 VC를 다른 VC의 내부에 표시하는 경우에는 VC의 View들에 대한 LifeCycle 작업을 모방할 필요가 있다(?)
LifeCycle Event 알림
UIViewController에는 특정 작업이 발생했을 때, 알려주는 메소드들이 있다.
viewDidLoad, viewWillAppear 등과 rootView를 설정하는 loadView 메소드가 있다.
UIViewController - UIView 관계
- loadView
- VC의 rootView가 로드되는 곳
- 현재 VC의 view는 nil이다.
- Custom View를 만들고 설정하려면 해당 메소드를 override해야 한다.
- IB를 사용해 만드는 경우에는 override하면 안된다.
- 이 메소드를 직접 호출해서는 안된다.
- viewDidLoad
- View를 생성하고 메모리에 로드한 후에 한번 호출한다.
- 그러나 View의 Bounds가 설정되지 않았기 때문에, 화면에 표시되지 않은 상태이다.
- viewWillAppear
- 화면에 View가 나타나기 직전에 호출된다.
- View의 Bounds는 정의되지만, 방향을 설정되지 않은 상태이다.
- viewDidAppear
- 애니메이션을 시작하기에 좋은 시기
- viewWillLayoutSubviews
- LifeCycle에서 View의 Bounds를 배우는 첫 시기
- UIView에서 layoutSubviews 메서드가 트리거되기 직전에 호출된다.
- rootView의 하위뷰가 로드될 때도 호출된다.
- ex) CollectionView의 Cell이 로드될 때 호출됨
- viewDidLayoutSubviews
- layoutSubviews가 호출된 직후에 호출됨
- 하위뷰가 설정되고 크기, 위치, 제약 등이 적용된다.
- viewWillLayoutSubviews와 viewDidLayoutSubviews는 가로 <-> 세로 변경시에도 호출된다.
- 그 말은 View의 Bounds가 업데이트되거나 View의 Layout이 재계산될 때마다 재 호출된다는 것이다.
- viewWillDisappear
- 화면에서 뷰가 사라지려고할 때 호출된다.
- 여기서 할 수 있는 작업
- 데이터를 잃지 않도록 저장하는 것
- 네트워크 작업 취소
UIViewController - UIViewController 관계
단순히 VC의 LifeCycle이 아니라 VC 내에 VC가 존재하는 상황을 이해하고자 한다.
시스템에 상태를 알리기 위해, 일부 LifeCycle 메서드를 직접 호출해야 하는 경우가 있기 때문이다.
'iOS' 카테고리의 다른 글
[iOS] Framework vs Library / 모듈화 (0) | 2021.06.01 |
---|---|
[iOS] UIView / 레이아웃 업데이트 관련 메소드 (0) | 2021.05.24 |
[iOS] UIWindowScene / UIWindow / UIView (0) | 2021.05.23 |
[iOS] HitTest (0) | 2021.05.21 |
[iOS] Responder / Responder Chain (0) | 2021.05.21 |