1️⃣ View Controller의 View의 상태변화에 따른 메서드의 호출순서를 이야기해보세요.
loadView() -> viewDidLoad() -> viewWillAppear() -> viewDidAppear()
-> viewWillDisappear() -> viewDidDisappear() 순서로 호출이 됩니다.
# 꼬리질문
# 각각의 메서드는 어떤 역할을 가지고 있을까?
loadView()
- controller가 관리하는 view를 만드는 역할
ex) customView를 mainView로 설정할때- 이 메소드 안에서 새로운 뷰를 만들어서 뷰 컨트롤러의 메인 뷰로 설정해줘도 된다.
- 뷰 컨트롤러의 기본 뷰를 커스텀 뷰로 사용하고자 할 때 유용. 스토리보드를 쓰면 어차피 스토리보드에 있는 뷰를 가져와 쓸 테니 굳이 필요하지 않다.
- 모두 직접적으로 코딩하여 만드는 경우를 제외하고는 override하지 않는 것이 좋다고 한다.
viewDidLoad()
- view가 메모리에 로드되고 난 후에 호출
- stack으로 로드된다
- 뷰의 초기화 작업을 진행한다
ex) 옵져버 등록
viewWillAppear()
- view가 이제 나타날 거라는 신호를 controller에게 알리는 역할
- 화면이 나타날때마다 수행하는 작업을 진행한다.
ex) 뷰에 보여질 데이터 불러오기
viewDidAppear()
- view가 나타났다는 것을 controller에게 알리는 역할, 에니메이션 적용
- view 나타날 때 수행할 추가작업을 진행한다. 보통 다른 view에 있다가 돌아오는 경우 실행 되어야하는 작업들이다.
ex:) 사용자 환영 애니메이션, 배경음악 재생
viewWillDisappear()
- view가 삭제되려 한다는 것을 viewController에 알리는 역할
- view가 사라지려고 하는 순간 진행되어야 하는 작업들
ex) 배경음악 중지, 자동저장 작업
viewDidDisappear()
- view가 제거되었음을 알리는 역할
- view가 제거되고 나서 진행되어야하는 작업
ex) 옵져버 구독 중단
출처: 야곰아카데미 활동학습
# View Life Cycle은 누가 관리를 할까 ?
- view는 보여지게 하는 역할일뿐, viewController가 View Life Cycle 관리한다.
출처: 야곰아카데미 활동학습 3/3
# 왜 super.*** 를 호출해야할까 ?
- 첫번째 이유): Apple문서에 써져있음, If you override this method, you must call super at some point in your implementation.
- 두번째 이유): View Controller는 UIViewController를 상속하는 class인데, UIViewController가 기밀이라 추후 Apple은 언젠가 구현을 변경하여 발생 할 수 있는 충돌을 예방하기 위해서.
- 야곰닷넷 이유): 뷰가로드되고 났을때, 우리는 알수없는 UIViewController에서 뷰를 만들때 하는 여러 설정들을 ‘마무리’해주는 작업이 필요하다고 해요.
그래서 super.viewDidLoad()를 해줘서 어떤 기초적인 설정들을 ‘마무리’해주는 작업을 하고 그 이후에 우리는 우리가 하고싶은 어떤 작업들을 하죠.
만약에 super.viewDidLoad()를 맨 밑에 적고, 그 사이에 어떤 작업들을 해주게되면 아직 viewDidLoad()의 설정이 끝나지않은 상태에서 어떤 작업들이 이루어지므로
이상한 버그와 동작이 발생할 수 있는 것으로 알고있어요. 물론 그것을 제외하더라도 대충 찾아보면 습관적으로 꼭 호출하도록 하라고는 하더군요
[super을 붙여줘야하는 이유]
- Reference
- https://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method
- https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload
- https://yagom.net/forums/topic/override-%ED%95%A0-%EB%95%8C-super-%EA%BC%AD-%ED%98%B8%EC%B6%9C%ED%95%B4%EC%95%BC-%ED%95%98%EB%82%98%EC%9A%94/
- https://docs.swift.org/swift-book/LanguageGuide/Inheritance.html#ID196
2️⃣ viewWillAppear와 viewDidAppear에서 무엇을 하면 좋을까요?
viewWillAppear
view가 화면에 보이기 직전에 호출되기 때문에 다음과 같은 작업을 수행하면 좋다.
- 표시되는 view의 방향(가로모드, 세로모드)
- 변경사항을 화면에 전달할 때(ex: 백그라운드 색상변경)
- 뷰에 보여질 데이터를 불러온다. (데이터가 갱신이 되는 경우)
viewDidAppear
view가 view계층에 추가되고, 화면에 보이고 난 후 호출되기 때문에 다음과 같은 작업을 수행하면 좋다.
- 이미지 또는 텍스트에 에니메이션 적용(사용자가 변경사항을 볼 수 있음)
- 배경음악 재생
3️⃣ UIView의 layoutSubviews 메서드는 viewWillAppear보다 먼저 호출되나요? 그렇게 생각한 이유는 무엇인가요 ?
- 아니요. viewWillAppear 이후에 호출됩니다.
- 기본적으로 앱이 실행될때 위와같은 사이클을 지나고 난 후에 화면에 view가 그려지게됩니다.
- view를 화면에 나타내려면 일단 view가 존재해야 합니다. 없는데 보여줬다고 할 수 없기때문이죠.
- view는 크게 layout과 display두 가지를 통해서 위치와 크기를 잡고 화면에 view를 그리게 됩니다.
- 그렇게 view가 그려지면 화면에 나타낼 수가 있습니다. 그 다음에 view가 다그려졌기때문에 viewDidAppear를 호출할 수 있는것이죠!
- render loop가 크게 constraints -> layout -> Draw순으로 호출되는데 Layout에 layoutSubviews가 포함이 되어있습니다.
- layoutSubviews는 view와 subview들의 위치 및 크기조정을 재배치하는 기능인데 화면을 나타내기 이전에 view를 그릴때하는 행동입니다.
- 그렇기때문에 layoutSubview는 viewWillAppear가 호출된 후에 호출이 됩니다.
# 꼬리질문
# Constraints? Layout? AutoLayout?
Constraints(제약)을 통해 view의 layout(배치)을 잡는다.
Auto Layout(자동배치) -> constriant를 이용하여 view의 크기와 위치를 자동으로 조정하하게 하는 것
# layoutSubviews는 어떤 역할을 수행하나요?
view와 subview들의 위치 및 크기조정을 재배치하는 역할이다.
# layoutSubviews는 어떤상황에 호출되나요 ?
- view의 크기를 조절할때
- Subviews를 추가/ 삭제할때
- 사용자가 "UIScrollView"를 스크롤할때
- 기기를 회전할때
- view의 autolayout constraint값을 변경할때
- view의 bounds가 바뀔 때
https://stackoverflow.com/questions/728372/when-is-layoutsubviews-called
'면접질문정리' 카테고리의 다른 글
[Architecture] Protocol Oriented Programming과 Object Oriented Programming의 차이점을 설명하시오. (0) | 2022.08.22 |
---|---|
[iOS] UIWindow의 역할은? (0) | 2022.08.22 |
[Swift] 스위프트 언어의 String에서 subscript를 통해 문자에 접근할 수 없는 이유에 대해 설명해주세요. (0) | 2022.08.22 |
[Swift] Result Type이란? (0) | 2022.08.22 |
[Swift] lazy var로 초기화했을때의 장단점? (0) | 2022.05.09 |