init(frame:)
- Interface Builder에서 적용하지 않고, 코드로 직접 UIView를 상속받은 클래스를 만들 때 사용
required init?(coder: NSCoder)
- init(frame:)과 마찬가지로 UIView를 상속받은 클래스를 만들 때 구현해줘야 한다.
언제 사용될까?
스토리보드나 Xib파일에서 리소스를 가져와야 할 때
Cell을 xib로 구성 하였을때와 같이 스토리보드나 Xib파일을 이용해 UI를 구성하는 것이 가능하다.
이 부분은 NSCoding에서 해답을 얻을 수 있다.
인터페이스 파일은 UI 구성을 xml형태로 저장하고 있는데 이 저장한 형태를 사용자의 화면으로 그대로 가져오기 위해선
이 파일에 대한 구조를 가져오는것이 필요한데 이것이 deserialization이라고 한다.
View를 Inspector를 통해 커스텀하는 경우 아래의 구문이 들어간다.
class CustomView: UIView {
@IBOutlet weak var customButton: UIButton!
override init(frame: CGRect) {
super.init(frame: frame)
self.configure()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
self.configure()
}
func configure() {
customButton.translatesAutoresizingMaskIntoConstraints = false
customButton.centerXAnchor.constraint(equalTo: super.centerXAnchor).isActive = true
customButton.centerYAnchor.constraint(equalTo: super.centerYAnchor).isActive = true
}
}
따라서 xib나 스토리보드로 생성할 때는 init(coder: NSCoder)를 통해 객체가 생성된다.
awakeFromNib()
- Interface Builder에서 객체가 init(coder:)로 초기화된 후 호출된다.
- 뷰가 로딩이 다 된 후 압축 해제하고 메모리에 로드된 시점
- 뷰 자체가 로딩이 끝 낫을 때 불러진다.
Interface Builder에서 inspector와 같은 방법으로 값을 조정하면 커스텀 클래스는 아카이브 되어있다가 언아카이브로 변경되는데
이때 init(coder:)가 호출되며 내부 속성이 초기화된다.(init시점에는 frame과 관련된 크기, 위치의 정보들이 정해지지 않은 상태이다)
생성자를 추가하면 init(frame:)과 required init?(coder: NSCoder)이 자동으로 추가되는 이유
UIView가 NSCoding프로토콜을 채택하고 있기 때문에 하위 메서드를 같이 정의해줘야 한다.
'iOS 기초' 카테고리의 다른 글
iOS 화면전환 (0) | 2021.12.10 |
---|---|
AppDelegate, SceneDelegate (0) | 2021.12.10 |
Nib, Xib (0) | 2021.12.07 |
App LifeCycle (0) | 2021.12.07 |
ViewController LifeCycle (0) | 2021.12.07 |