이번내용은 코딩을 하던 와중에 뷰 컨트롤러의 라이프 사이클에서는 볼수 없었지만 코드를 작성할때 셀의 UI를 변경하는 코드 등을 awakeFromNib에 작성하길래 무엇인지 궁금해서 공부하면서 정리해 보았습니다.
awakeFromNib() 은 객체가 초기화(인스턴스화)된 후 호출된다.
-
UIView에서 상속받은 커스텀 View클래스를 만들고 인터페이스 빌더에 지정하면(오른쪽 탭 inspector에서 지정하는 방법으로) 커스텀 클래스는 아카이브되어 있다가 언아카이브되게 된다.(xib파일에)
-
이때 init(coder:)가 호출되고 내부 속성이 초기화된다
-
일부는 이 때 의미없는 값으로 초기화되거나 IBOutler을 비롯한 객체 참조 관계가 불명확할 수 있다.
- init 시점에서는 frame과 관련된 크기, 위치 등 뷰가 완벽하게 만들어지지 않은 상태
- 이와같이 인터페이스 빌더에서 연결된 객체의 변수를 사용하려고 할때 awakeFromNib()을 사용함
- 이렇게 awakeFromNib()은 객체를 인스턴스화 한 후(init()이 호출된 후) 호출된다.
-
(IBOutlet이 없어도 awakeFromNib()은 호출됨)
코멘트 추가
경험상 init(coder:) 시점에는 frame 이나 Layer 관련없는 값들, awakeFromNib 시점에는 frame 이나 Layer 관련된 값들을 설정하도록 구현하면 됩니다. init(frame:) 은 이미 frame 정보가 있으니까 괜찮구요. 물론 autoLayout 처리를 하는 경우는 awakeFromNib 보다 더 뒤에 해야합니다.
-
아카이브의 모든 객체가 로드되고 초기화된 이후에, nib-loading인프라 스트럭처는 nib archive로부터 재성성된 각 객체에게 awakeFromNib 메세지를 보낸다. 객체가 awakeFromNib 메세지를 수신할 때, 모든 outlet과 action연결이 이미 설정되었음을 보장한다.
-
부모클래스에 필요한 어떤 부가적인 초기화를 수행하려면 다음과 같은 예시
override func awakeFromNib() { super.awakeFromNib() thumbnailImageView.layer.cornerRadius = 4 }이 메서드를 오버라이드하여 생성 및 초기화가 완료된 객체들이 수행할 작업들을 처리할 수 있다. 반드시 이 과정에는 super.awakeFromNib을 호출해야 한다.
-
정리하자면 awakeFromNib()은 UICollection View로 그림들이 로드될 때(awake) 호출되는 함수다.
-
viewDidLoad -> UITableView ->> DataSource Trigger --> dequeuing from TableView cache ->> load instance with UX from storyboard -> awakeFromNib called
호출 순서.
1. loadView view
2. DidLoad
3. awakeFramNib
4. viewWillAppear
5. ViewDidAppea
'IOS > Swift' 카테고리의 다른 글
[TIL] Swift. GCD (Grand Central Patch) (0) | 2020.10.17 |
---|---|
[TIL] Swift. Frame and Bounds (0) | 2020.10.15 |
[TIL] Swift. ViewController LifeCycle (0) | 2020.10.12 |
[TIL] Swift. ARC ( Automatic Reference Counting ) (0) | 2020.10.09 |
[TIL] Swift. dequeueReusableCell (0) | 2020.10.09 |