Skip to main content

UIView위의 IBOutlet 생성시기는?

Published Markdown
Part of seriesiOS
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에서 실행되는 함수가 있는 것 같다.

-끝-

About the author

  • 안녕하세요🙇🏻‍♂️ 세상을 더 편리하게 바꾸고 싶은 iOS 개발자 최인호입니다.

    Hello 👋 I'm Inho Choi, an iOS developer who wants to change the world more conveniently.

    • 대학교 졸업
    • Apple Developer Academy @ POSTECH 1기
    • KWDC Main Organizer
    • AsyncSwift Organizer

No comments yet. Be the first to comment.

More from this blog