UIView위의 IBOutlet 생성시기는?

UIView위의 IBOutlet 생성시기는?

지난 시간에 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문을 주목해보자.

  1. MyView의 init

  2. ViewController의 init

  3. ViewController의 loadView

  4. 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
  1. my View init

    아직 onLabel의 객체가 만들어지지 않았다.

  2. ViewController의 init

    myView.onLabel의 객체가 만들어졌다!

  3. loadView / viewDidLoad

    ViewController의 객체가 init에서 만들어졌기에 당연하게 만들어 졌다.

💡
UIView위의 IBOutlet 객체는 생성자 이후에 만들어진다!
  • ( IB = Interface Builder )

생성자가 끝난 후에 UIKit에서 실행되는 함수가 있는 것 같다.

-끝-