Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

sanichdaniel의 iOS 개발 블로그

viewController's root view 본문

카테고리 없음

viewController's root view

sanich8355 2020. 9. 27. 00:58
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

 

Apple Developer Documentation

 

developer.apple.com