IOS/Swift

[TIL] Swift. awakeFromNib

이번내용은 코딩을 하던 와중에 뷰 컨트롤러의 라이프 사이클에서는 볼수 없었지만 코드를 작성할때 셀의 UI를 변경하는 코드 등을 awakeFromNib에 작성하길래 무엇인지 궁금해서 공부하면서 정리해 보았습니다.

awakeFromNib() 은 객체가 초기화(인스턴스화)된 후 호출된다.

  1. UIView에서 상속받은 커스텀 View클래스를 만들고 인터페이스 빌더에 지정하면(오른쪽 탭 inspector에서 지정하는 방법으로) 커스텀 클래스는 아카이브되어 있다가 언아카이브되게 된다.(xib파일에)

  2. 이때 init(coder:)가 호출되고 내부 속성이 초기화된다

  3. 일부는 이 때 의미없는 값으로 초기화되거나 IBOutler을 비롯한 객체 참조 관계가 불명확할 수 있다.

    • init 시점에서는 frame과 관련된 크기, 위치 등 뷰가 완벽하게 만들어지지 않은 상태
    • 이와같이 인터페이스 빌더에서 연결된 객체의 변수를 사용하려고 할때 awakeFromNib()을 사용함
    • 이렇게 awakeFromNib()은 객체를 인스턴스화 한 후(init()이 호출된 후) 호출된다.
  4. (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