Skip to main content

Command Palette

Search for a command to run...

UIView위의 IBOutlet 생성시기는?

Published
UIView위의 IBOutlet 생성시기는?
T

안녕하세요🙇🏻‍♂️ 세상을 더 편리하게 바꾸고 싶은 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

지난 시간에 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에서 실행되는 함수가 있는 것 같다.

-끝-

More from this blog

[CS] Https는 대칭키일까? 비대칭키일까?

결론: 둘 다 쓴다. 하지만 쓰는 타이밍은 다르다. 자세하기 알아보자. 혹시 모르니 용어는 정리해두자. 암호화 <-> 복호화 해독 = 복호화 비대칭키 해독은 대칭키 해독보다 오래 걸린다. 비대칭키를 쓰는 과정 💡 비대칭키는 대칭키를 만들기 위한 여정에 쓰인다. 뭔 소리지??? 대칭키를 만들기 위해서 비대칭키가 쓰인다고?? 비대칭키 해독은 대칭키 해독보다 오래걸린다. 1. Client가 Server에 접속을 요청하면 서버는 Secret ...

Jun 6, 202417

Xcode Cloud 사용 후기

애플에게 내는 친구비를 내며 Apple Developer 계정을 유지하려면 매년 애플에게 13만원의 친구비를 지불해야한다. 그리고 몇 개 친구 답례 상품을 주는데 그 중 하나가 Xcode Cloud 상품 주는데 안 쓸 이유는 없지 Xcode Cloud 개인에게는 과연? K-Spam 이라는 앱을 오랫동안 구상하고 드디어 출시를 했다. 생각보다 삽질을 많이 한 것 같다. 하지만 사이드 프로젝트의 진정한 의미는 삽질(?)하며 배우는 것이 아니겠나 개...

Jun 3, 202418

iOS Version 주의

앱 버전에는 상위버전이 출시한 상태에서 하위 버전을 아카이브 할 수 없음 예를 들어 출시한 버전이 1.3 이면 1.2로는 아카이브가 불가능함 단, 출시한 적이 없는 앱이라면 버전은 마음대로 지정 가능 App Store Connect의 버전 예를 들어 1.03 이랑 1.1 이랑 비교하면 앱 버전은 1.03 > 1.1 로 인식한다. . 단위로 잘라서 Int로 인식하는 것 같다. 그러니 0은 최대한 사용하지 않고 구분한다면 . 으로 구분해야겠다.

Jun 1, 20248

Toby의 iOS 블로그

34 posts

안녕하세요 세상을 더 편리하게 바꾸고 싶은 iOS 개발자입니다.