override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func awakeFromNib() {
super.awakeFromNib()
}
일반적으로 cell을 init 하는 함수는 위 3가지가 있다. UIView를 생성하기 위한 필수적인 init(Designated initializer)는 override init(frame: CGRect), required init?(coder: NSCoder) 2가지다. 따라서 만일 코드로만 작성된 UIView가 생성될때 let view = UIView()를 사용해서 뷰를 만들 것이다. 이 init()을 호출하면 내부적으로 init(frame: CGRect)를 호출한다.
그리고 required init?(coder: NSCoder)는 스토리보드나 Xib 파일에서 작성된 요소를 가져올 때 불린다. NSCoder 객체에서 스토리보드나 Xib로 작성된 뷰가 실제로는 xml 형태로 저장되고 있는데, 이 형태를 전달, 연결하는 매개체가 coder 객체이다. NSCoder는 xml 형태로 된 파일을 아카이빙 하고 있고, 내부적으로 decoding, encoding을 수행하고 있다. 따라서 이 정보가 없으면 객체를 생성할 수 없으므로 init이 옵셔널인 것.(스토리 보드에서 이름을 잘 넣자.)

이 함수는 객체가 초기화 된 이후의 시점에 호출된다. 스토리 보드상에서 IBOutlet으로 연결된 값들중 inspector에서 값 변경이 일어나거나 요소가 변한다면 해당 클래스는 아카이브 상테에서 언아카이브로 상태로 변화된다. 여기서 init(coder:)가 호출 되면서 내부 속성이 다시 초기화 된다.
이름이 Nib인 이유는 빌드 시 Xib(Xml Interface Builder)파일은 Nib(NeXT Interface Builder)으로 변화되기 때문. xib는 flat file(아무런 구조적 상호관계가 없는 레코드들이 들어 있는 파일)에 저장되고, 이것이 binary 파일인 nib으로 바뀐다. xib은 Bundle이 아닌 flat file이기 때문에 SCM(source control management: 소스 제어 관리)시에 시스템을 효율적으로 처리 가능하기 때문에 xib를 사용하는 것. Git 과 같은 형상관리 시스템에서 diff를 딸때 코드가 Binary 파일이면 문제가 있을 것.
결과적으로 init(coder:)가 호출 된 뒤, 객체의 초기화가 끝나면 outlet, action의 처리까지 끝나면 객체에게 awakeformNib을 호출하는 것. 만일 IBOutlet과 관련된 작업이 있다면 outlut과 연결이 확실하게 보장된 awakeformNib 이후에 하는 것이 안전하다.
prepareForInterfaceBuilder() 라는 함수 또한 있는데, 이것은 @IBDesignable을 사용해서 커스텀 뷰를 만들 경우에 사용 된다. 인터페이스 빌더 상에 디자인 타임에 초기화 되는 함수이다.
참고 자료
https://developer.apple.com/documentation/objectivec/nsobject/1402907-awakefromnib
Apple Developer Documentation
developer.apple.com
https://zeddios.tistory.com/298
iOS ) nib과 xib의 차이
안녕하세요 :) Zedd입니다. 글을 쓰다가 xib와 nib의 차이점이 궁금해졌습니댜 nib은 (NeXT Interface Builder)의 약자라고 해요. xib는(Xml Interface Builder) xib는 이름에서 볼 수 있듯이 xml기반입니다. nib..
zeddios.tistory.com
https://developer.apple.com/documentation/objectivec/nsobject/1402908-prepareforinterfacebuilder
Apple Developer Documentation
developer.apple.com
[iOS] XIB, NIB 톺아보기
UITextField 에 들어오는 입력에 따라 UILabel 의 상태를 변경해야 하는데, 이를 모두 Controller ...
blog.naver.com
'iOS > 학습' 카테고리의 다른 글
Custom Horizontal FlowLayout (0) | 2022.06.21 |
---|---|
RxNimble + Quick Unit Test (0) | 2022.05.26 |
iOS RxDataSource로 Custom Xib CalendarView 만들기 (0) | 2022.05.07 |
iOS에서의 Frame vs Bounds (0) | 2022.04.24 |
Storyboard 에서 Generic Type 의존성 주입하기 (0) | 2022.03.20 |