본문 바로가기
iOS/Study

[ChatGPT 검색] Swift에서 코드로 뷰를 생성하는 방법을 정리해줘

by 소토리텔러 2024. 3. 8.
import UIKit

class CustomView: UIView {

    // 이곳에서 뷰의 속성을 설정하거나 추가적인 코드를 작성할 수 있습니다.

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }

    private func setupView() {
        // 뷰의 기본 설정을 수행합니다.

        // 배경색 설정
        backgroundColor = UIColor.blue

        // 프레임 설정 (크기와 위치)
        frame = CGRect(x: 0, y: 0, width: 200, height: 100)

        // 텍스트 레이블 추가
        let label = UILabel(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
        label.text = "Hello, Custom View!"
        label.textColor = UIColor.white
        label.textAlignment = .center
        addSubview(label)
    }
}

// 뷰 컨트롤러에서 CustomView를 사용하는 예제
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CustomView 인스턴스 생성
        let customView = CustomView()

        // 뷰 컨트롤러의 뷰에 추가
        view.addSubview(customView)
    }
}

 

 

Q. 왜 두 생성자에서 모두 초기화 해야 돼? 한번만 하면 안돼?

 

init(frame:) - 코드로 생성
이 생성자는 코드에서 CustomView를 직접 생성할 때 호출됩니다.
이 경우, frame 매개변수에 따라 뷰의 초기 프레임을 설정할 수 있습니다.


init?(coder:) - Interface Builder로 로드
이 생성자는 Interface Builder에서 스토리보드 또는 xib 파일을 통해 CustomView를 로드할 때 호출됩니다.
Interface Builder는 뷰를 인코딩하고 디코딩하기 위해 NSCoder를 사용하는데, 이 생성자는 그 과정에서 호출됩니다.

 

두 가지 시나리오를 모두 지원하기 위해 두 생성자를 모두 구현하는 것이 일반적입니다.

그렇지 않으면 코드로만 뷰를 생성하거나 Interface Builder로만 뷰를 로드하는 경우에 문제가 발생할 수 있습니다.

 

중복 초기화되는 것을 방지하기 위해 아래와 같은 방법으로도 사용한다고 한다.

import UIKit

class CustomView: UIView {

    private var isSetup = false

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    private func commonInit() {
        guard !isSetup else { return }
        setupView()
        isSetup = true
    }

    private func setupView() {
        // 뷰의 기본 설정을 수행합니다.

        // 배경색 설정
        backgroundColor = UIColor.blue

        // 프레임 설정 (크기와 위치)
        frame = CGRect(x: 0, y: 0, width: 200, height: 100)

        // 텍스트 레이블 추가
        let label = UILabel(frame: CGRect(x: 10, y: 10, width: 180, height: 80))
        label.text = "Hello, Custom View!"
        label.textColor = UIColor.white
        label.textAlignment = .center
        addSubview(label)
    }
}

// 뷰 컨트롤러에서 CustomView를 사용하는 예제
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CustomView 인스턴스 생성
        let customView = CustomView()

        // 뷰 컨트롤러의 뷰에 추가
        view.addSubview(customView)
    }
}