Post

UIKit - MVC 패턴 View 구현

UIKit - MVC 패턴 View 구현

MVC 패턴 View 구현

MVC(Model View Controller) 패턴에서 화면을 담당하는 View를 구현할 떄는 UIView 클래스를 상속해서 처리해야함.

BasicView.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import UIKit

class BasicView: UIView {
    
    private let exLabel: UILabel = {
        let label = UILabel()
        
        label.text = "Hello World!"
        
        return label
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setupUI()
        setupConstraint()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        fatalError()
    }
    
    func setupUI(){
        
        self.backgroundColor = .white
        
        addSubview(exLabel)
    }
    
    func setupConstraint(){
        exLabel.translatesAutoresizingMaskIntoConstraints = false
        
        exLabel.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        exLabel.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    }
}

이때 두 가지 생성자를 필수적으로 구현해줘야함.

1
2
3
4
5
6
7
8
9
10
11
12
// 코드로 뷰를 만들 때 사용되는 생성자
override init(frame: CGRect) {
  super.init(frame: frame)
  setupUI()
  setupConstraint()
}
    
// 스토리보드로 뷰를 만들 때 사용되는 생성자
required init?(coder: NSCoder) {
  super.init(coder: coder)
  fatalError() // 코드로만 구현했을 경우 호출될 일이 없기 때문에 만약 호출될 경우 앱이 죽도록 구성
}

UIView를 상속받은 커스텀 뷰는 코드로 생성될 수도 있고, 스토리보드에서 생성될 수도 있기 때문에 두 생성자를 모두 구현해야 함.

ViewController.swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import UIKit

class ViewController: UIViewController {

    let basicView = BasicView()
    
    override func loadView() {
        self.view = basicView
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

loadView()를 오버라이드해서 ViewController의 루트 뷰를 직접 교체하면, 커스텀 UIView가 메모리에 로드될 때 자동으로 화면에 표시됨.

결과

image

This post is licensed under CC BY 4.0 by the author.