안녕하세요~
릴리입니다😊
오늘은 UIViewController
의 인스턴스 메서드인 loadView()
에 대해서 알아볼게요!
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
애플 공식문서와 다른 블로그 레퍼런스들을 토대로 작성되었습니다.
컨트롤러가 관리하는 뷰를 만든다.
컨트롤러가 관리하는 뷰??
그게 뭐죠??
UIViewController
는 view
라는 인스턴스 프로퍼티를 가지고 있습니다.
이 view
는 컨트롤러가 관리하는 뷰 계층구조 내에서 root view를 표현합니다.
loadView()
는 뷰 컨트롤러의 루트 뷰를 로드하거나 만든 다음,view
에 할당해주는 역할을 합니다.
뷰 컨트롤러의 view
는 디폴트 값이 nil
입니다.
처음 뷰 컨트롤러 인스턴스를 만들었을 때는 루트 뷰가 없는 것이죠.
view
에 접근했는데 nil
일 때,
뷰 컨트롤러는 loadView()
를 자동으로 호출한 다음, 여기서 만든 뷰를 view
에 할당합니다.
loadView()
의 기본적인 구현은 다음과 같은 동작을 합니다.
view
에 할당한다.UIView
인스턴스를 생성해서, view
에 할당한다.따라서 인터페이스 빌더를 통해서 뷰를 만들었거나, 뷰 컨트롤러를 초기화 하고 싶으면 이 메서드를 override
하면 안됩니다. loadView()
가 알아서 관련 nib file을 통해서 뷰를 만들어주기 때문이죠.
스토리보드나 nib file을 통해서 뷰를 만들지 않고, CustomView를 루트뷰로 사용하고자 하는 경우엔 override
해서 사용할 수 있습니다.
override loadView() {
view = CustomView()
}
단, super.loadView()
는 호출하면 안됩니다.
위 내용과 참고 블로그를 통해서
view
가 만들어지는 과정을 정리해보자면 아래와 같습니다.
뷰 컨트롤러가 view
에 접근을 한다.
view
가 nil
이면 뷰컨은 loadView()
를 호출한다.
override
가 되어있다면 override loadView()
를 실행하고, 만들어진 뷰를 view
에 할당한다.
override
되어있지 않다면, 뷰 컨트롤러의 연관된 nib file을 찾는다.
init(nibName:bundle:)
에 지정한 nibName
에 해당하는 nib file을 먼저 찾고,
만약 nibName
이 없으면 뷰 컨트롤러 이름으로 nib file을 찾는다
연관된 nib file이 있다면, nib file로 뷰를 로드하고, view
에 할당한다.
연관된 nib file이 없다면, UIView
인스턴스를 생성해서 view
에 할당한다.
loadView()
는 뷰 컨트롤러의 루트뷰(view
)를 만들고 로드하는 메서드이다- 인터페이스 빌더를 통해 루트 뷰를 만들었을 땐
loadView()
를override
하지 말자- 코드로 작성한 커스텀 뷰를 루트 뷰로 지정해주고 싶을 때만,
override
해서 구현하자
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview
https://developer.apple.com/documentation/uikit/uiviewcontroller/1621487-nibname
https://mrgamza.tistory.com/279#comment17070812