지난 시간에 UIViewController의 객체 생성은 언제되는지 알아보았다.
문뜩 궁금해졌다. UIViewController는 생명주기가 있다 하지만, UIView는 어떨까?
먼저 시작하기 전에 아래 코드를 알고 있어야함
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
맞음 우리가 맨날 UIKit Programmatically(코드로만 짤 때) 자주 마주치던 놈임
쓸 땐 몰랐다. 그냥 에러 뱉어주면서 알아서 만들어주니깐;;;
저 생성자는 Xib 파일로 불러 올 때 호출되는 생성자다.
Xcode가 상세하게 설명해주고 있었던 것이다.
너 코드로만 짤꺼지? 그럼 Xib파일로 만들어지는 100%에러일 테니깐 저거 fatalError 처리 할게!
그럼 우리 저 생성자를 통해서 UIView 위에 올라가는 컴포넌트는 언제 생성되는지 알아보자.
간단하게 UIView 위에 UILabel을 올렸다.
class ViewController: UIViewController {
private var myView = Bundle.main.loadNibNamed("MyView", owner: self)?.first as? MyView
required init?(coder: NSCoder) {
super.init(coder: coder)
print("VC init] myView.onLable is nil? \(myView?.onLabel == nil)")
}
override func loadView() {
super.loadView()
print("VC loadView] myView.onLable is nil? \(myView?.onLabel == nil)")
}
override func viewDidLoad() {
super.viewDidLoad()
print("VC viewDidLoad] myView.onLable is nil? \(myView?.onLabel == nil)")
guard let myView else { return }
myView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(myView)
NSLayoutConstraint.activate([
myView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
myView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
myView.heightAnchor.constraint(equalToConstant: 400),
myView.widthAnchor.constraint(equalToConstant: 200)
])
myView.onLabel.text = "바뀜"
}
}
class MyView: UIView {
@IBOutlet weak var onLabel: UILabel!
required init?(coder: NSCoder) {
super.init(coder: coder)
print("VC myView init] myView.onLable is nil? \(onLabel == nil)")
}
}
위 결과는 어떻게 나올까? 먼저 print문을 주목해보자.
MyView의 init
ViewController의 init
ViewController의 loadView
ViewController의 viewDidload
VC myView init] myView.onLable is nil? true
VC init] myView.onLable is nil? false
VC loadView] myView.onLable is nil? false
VC viewDidLoad] myView.onLable is nil? false
my View init
아직
onLabel
의 객체가 만들어지지 않았다.ViewController의 init
myView.onLabel
의 객체가 만들어졌다!loadView / viewDidLoad
ViewController의 객체가 init에서 만들어졌기에 당연하게 만들어 졌다.
💡
UIView위의 IBOutlet 객체는 생성자 이후에 만들어진다!
- ( IB = Interface Builder )
생성자가 끝난 후에 UIKit에서 실행되는 함수가 있는 것 같다.
-끝-