iOS 기초

init(frame:), required init?(coder: NSCoder), awakeFromNIb()

motosw3600 2021. 12. 7. 19:41

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