■ VC 의 상태를 4 가지로 구분할 수 있다
Appearing : 뷰가 화면에 나타나고 있는 상태
Appeared : 뷰가 화면에 나타나는게 완료된 상태
Disappearing : 뷰가 화면에서 사라지고 있는 상태
Disappeared : 뷰가 화면에서 사라진 상태
■ VC 의 흐름은 다음과 같다고 할 수 있다
viewDidLoad
-> viewWillAppear
-> viewDidAppear
-> viewWillDisappear
-> viewDidDisappear
Life Cycle Method
— Managing the View
loadView()
■ 이 메소드를 절대 직접적으로 호출해서는 안됨
■ 컨트롤러가 관리하는 뷰를 만드는 역할을 함
→ 뷰를 만들고 메모리에 올리는 과정
■ view 프로퍼티가 요청되었을 때 nil 이라면 VC가 이 메소드를 호출
■ 뷰를 로드/생성하고 view 프로퍼티에 할당함
■ 만약 VC 가 관련된 nib file 을 갖는다면, 이 메소드는 nib file 로부터 뷰를 로드함
■ 만약 nibName 프로퍼티가 non-nil 값을 반환한다면 VC는 관련 nib file 을 갖고 있는 것
→ VC 가 스토리보드에서 인스턴스화된 경우
→ init(nibName: bundle:) 메소드를 사용하여 명시적으로 nib 파일을 할당한 경우
→ iOS가 VC의 클래스 이름을 기반으로 하는 app bundle 에서 nib file을 발견한 경우
■ VC가 관련된 nib file 을 갖고 있지 않는다면, 이 메소드는 일반 UIView 객체를 대신 생성함
■ Interface Builder 를 통해 뷰를 생성하고 VC를 초기화하고자 한다면, 이 메소드를 override 해서는 안됨
■ 뷰를 수동으로 생성할 때는 이 메소드를 override 해도 됨
■ 이렇게 한다면 뷰 계층에서 root view 를 view 프로퍼티에 할당해야 함
■ 생성한 뷰는 고유한 인스턴스여야 하며 다른 VC 객체와 공유해서는 안됨
■ 이 메소드의 custom implementation(사용자 정의 구현)의 경우는 super를 호출해서는 안됨
■ 뷰에 대한 추가적인 초기화를 하고 싶다면 viewDidLoad() 메소드에서 구현하기
viewDidLoad()
■ VC가 해당 뷰 계층을 메모리에 로드한 후 호출됨
■ 이 메소드는 뷰 계층이 nib file로 부터 로드되었는지 loadView() 메소드를 통해 프로그래밍 방식으로 생성되었는지 여부에 관계없이 호출됨
■ 일반적으로 nib file 로 부터 로드된 뷰에 대해 추가적인 초기화를 할 때 override 를 함
■ 메모리에 처음 로드될 때 한 번만 호출됨
→ 딱 한번 호출될 행위들을 이 메소드 안에 정의
■ 뷰와 관련된 추가적인 초기화 작업. 네트워크 호출 등
— Responding to View-Related Events
viewWillAppear()
■ VC의 뷰가 뷰 계층에 추가되고, 애니메이션이 구성되기 전에 호출됨
→ 화면이 보여지기 직전에 호출됨
→ 뷰가 뷰 계층에 추가되려 한다는 것을 VC에게 알림
■ 다른 뷰로 이동했다가 돌아오면 재호출 됨
■ 뷰와 관련된 추가적인 초기화 작업
→ orientation 을 변경하거나
→ 방향에 맞게 조정하기 위해 status bar 의 스타일을 변경하거나
→ 보여지는 뷰의 스타일을 변경할 때
viewDidAppear()
■ 뷰가 화면에 나타난 직후에 호출됨
→ 뷰가 뷰 계층에 추가되었다는 것을 VC에게 알림
■ 뷰를 나타낼 때 필요한 추가 작업
■ 화면에 적용될 애니메이션을 그려줌
viewWillDisappear()
■ 뷰가 뷰 계층에서 실제로 사라지기 전에, 그리고 애니메이션을 구성하기 전에 호출됨
→ 뷰가 뷰 계층에서 삭제 되려한다는 것을 VC에 알림
■ 뷰가 사라지기 전에 처리해야하는 작업들
→ editing changes 커밋하거나
→ 뷰의 first responder 상태를 해지할 때
→ 기타 관련 작업을 수행하는데 사용
→ 최종적으로 데이터를 저장하는 작업
■ 뷰가 생성된 뒤 작업한 내용을 되돌리는 작업
→ 뷰가 처음 보여질 때 viewDidAppear() 메소드에서 작업했던 status bar 의 방향이나 스타일을 다시 되돌리는 경우 등
viewDidDisappear()
■ 뷰가 뷰 계층에서 사라진 뒤에 호출
→ 뷰가 뷰 계층에서 제거되었음을 VC에게 알림
■ 뷰가 사라지거나 숨는것과 관련된 추가 작업
Push vs. Present
Navigation Controller 를 사용해서 다음 화면이 push 되는 경우와 present 를 통해 화면을 띄우는 경우가 있는데 각각의 경우에 VC 의 생명주기와 관련된 메소드가 불리는 방식이 약간 차이가 있음!
Push
■ Navigation Controller 를 사용하게 되면 push 할수록 스택처럼 상단에 뷰가 쌓이는 형태를 갖는데
■ 다음 뷰를 push 하게되면 상단 뷰가 가려지기 때문에 VC 에서 viewWillDisappear 와 viewDidDisappear 가 호출되는 것을 확인 할 수 있음
■ 또한 다시 이전 화면으로 돌아가게 되는 경우에는 상단 뷰가 아래 남아있기 때문에 viewDidLoad 는 호출되지 않음!
Present
■ 위 그림처럼 일반적인 형태로 present 를 하게되면 이전 뷰 위에 겹쳐진것과 같은 모양을 하게됨
■ 그래서인지 present 를 하게되면 이전 뷰(VC) 가 disappear 되는 과정이 호출되지 않음
■ 그런데 present 형식을 Full Screen/Current Context 으로 설정하는 경우에는 뷰를 push 할 때와 동일하게 VC 가 disappear 되는 것이 확인됨 (뷰 계층에서 사라짐)
■ Over Full Screen/Over Current Context 의 경우는 VC가 disappear 되지 않음 (뷰 계층에서 사라지지 않음)
참고.
ViewController의 생명주기 — zeddios
'# iOS | Swift' 카테고리의 다른 글
Hugging Priority vs. Compression Resistance Priority (0) | 2022.01.04 |
---|