sanichdaniel의 iOS 개발 블로그
viewController's root view 본문
viewController의 view의 생성시점을 알아보자
loadView()
뷰컨의 루트 view를 만든다
뷰컨트롤러는 view 프로퍼티가 nil인 경우 이 함수를 호출한다.
이 함수는 view를 로드하거나 새로 생성해서 view 프로퍼티에 할당한다
만약 뷰컨트롤러가 스토리보드와 연관되어있다면 스토리보드에서 뷰를 로드한다.
아니라면 빈 UIView 객체가 생성되서 할당된다.
만약 뷰컨트롤러의 뷰를 수동으로 만들고 싶다면 이 함수를 오버라이드 하면 된다.
절대 super을 호출하면 안된다.
사용 예시
뷰컨트롤러의 view의 터치가 통과하게 바꾸고 싶을때
(super 호출하지 않은것을 확인할수 있다)
override func loadView() {
view = PassthroughView(frame: .zero)
}
ViewDidLoad()
This method is called after the view controller has loaded its view hierarchy into memory. This method is called regardless of whether the view hierarchy was loaded from a nib file or created programmatically in the loadView() method.
테스트 해본 결과
만약 B 뷰컨을 생성하고 present하지 않은 경우에
생성자에서 view를 print를 했을시 loadView()가 호출되었다.
하지만 view를 print하는 코드를 주석처리시 loadView()가 호출이 안되었다.
하지만 뷰컨을 present 할시에는 B 뷰컨에서 내부적으로 view에 접근하지 않더라도 loadView()가 호출이 되었다.
class A: UIViewController {
...
let b = B()
// present(b, animated: true)
}
class B: UIViewController {
init() {
super.init()
print(view) // 주석시 loadView() 호출 안됨
}
override loadView() {
print("Load View")
view = UIView()
}
}
viewController의 view가 ! 타입인 이유
뷰컨 생성 시점하고 view의 생성시점이 독립적이다.
present, view프로퍼티 접근하지 않으면 view가 메모리상에 생성이 안된다.
즉 nullable하다.
그리고 값이 접근된이후로는 항상 있을것이 보장되기에 ! 내재적 언래핑 타입으로 선언된것 같다
출처
developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview