UIView init

Judy·2022년 7월 30일
0

iOS

목록 보기
19/28

UIView init

  • UIViewinit

1. init(frame: CGRect)

지정된 프레임으로 새로 할당된 뷰 개체를 초기화하고 반환

override init(frame: CGRect) {
    super.init(frame: frame)
}
  • 새로운 UIVIew를 사용하려면 window 뷰 계층에 삽입해야 한다
  • 코드로 뷰 개체를 만드는 경우 init(frame: CGRect)UIView 클래스에 대한 이니셜라이저가 된다.
  • Interface Builder를 통해 디자인한 경우, 이후에 nib 파일에서 뷰가 로드될 때 이 메서드는 호출되지 않는다
  • nib 파일로 된 개체는 nib 파일에 저장된 속성과 일치하도록 뷰의 속성을 수정하는 init(coder:) 메서드를 사용해 재구성되고 초기화된다

2. init(coder:)

지정된 unarchiver의 데이터에서 초기화된 개체를 반환

  • unarchiving = storyboard나 xib를 활용하면 별도의 코딩 없이 앱의 속성을 수정할 수 있게 해주는 과정
  • interface builder는 코드가 아니기 때문에 앱을 컴파일 하는 시점에서 컴파일러가 인식할 수 없고 이를 코드로 변환 해 주는 unarchiving 과정이 필요
  • 이 과정에서 init?(coder:)가 사용됨
required init?(coder: NSCoder) {
        super.init(coder: coder)
}
  • Required
  • 스토리보드나 nib 파일을 통해 뷰를 로드하면서 커스텀하게 초기화를 해주고 싶다면 이 메서드를 사용
  • Nib 파일 = 인터페이스 빌더 문서
  • 스토리보드로 작성하는 뷰들도 모두 Nib으로 표현

3. awakeFromNib()

Interface Builder 아카이브 또는 nib 파일에서 로드된 후 서비스를 위해 receiver를 준비

  • 객체가 awakeFromNib 메시지를 받으면 모든 outlet 및 action 연결이 이미 설정되어 있음이 보장됨
  • 일반적으로 디자인 타임에 수행할 수 없는 추가 설정이 필요한 개체에 대해 awakeFromNib를 구현

🤔 커스텀 뷰는 스토리보드 안 쓰는데?

open class UIView : UIResponder, NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEnvironment, UICoordinateSpace, UIFocusItem, UIFocusItemContainer, CALayerDelegate { ... }
  • UIViewNSCoding 프로토콜을 채택
public protocol NSCoding {
    func encode(with coder: NSCoder)

    init?(coder: NSCoder) // NS_DESIGNATED_INITIALIZER
}
  • NSCoding은 실패가능한 이니셜라이저 init?(coder: NSCoder)를 작성하도록 되어있음
  • 프로토콜에서 요구하는 이니셜라이저를 구현할 때 required 키워드를 사용
  • UIVeiw를 상속받은 클래스들도 반드시 requiredinit?(coder: NSCoder)를 구현해야 함
  • 따라서 스토리보드를 사용하지 않은 커스텀 셀 뷰도 init?(coder: NSCoder)를 구현해야 함

정리 - View의 UI를 초기화하는 방법

1. Storyboard를 이용해 초기화

  • init(coder:)

2. xib 파일을 이용해 초기화

  • awakeFromNib()

3. code를 이용해 초기화

  • init(frame:)




참고 링크

UIView
init(frame: CGRect)
init(coder:)
awakeFromNib()
init(frame:), init(coder:)

profile
iOS Developer

0개의 댓글