iOS/개념 & 개발

[iOS] ViewController에서 View 분리하기

유정주 2022. 5. 17. 17:09
반응형

안녕하세요. 개발하는 정주입니다.

 

오늘은 "ViewController에서 View 분리하기"에 대해 알아보겠습니다.

제가 학습하고 이해한 내용을 정리한 것이라 틀린 부분이 있을 수 있습니다.

잘못된 점이 있다면 댓글로 알려주시면 감사하겠습니다.

 

 

ViewController에서 View를 분리하는 이유

모두 한 번쯤 디자인 패턴에 대해 들어보셨을 것입니다.

iOS에도 물론 MVP, MVC, MVVM 등 디자인 패턴이 적용되는데요.

이런 관점에서 ViewController는 View 보다는 Controller의 개념에 가깝습니다.

 

View + Controller로 사용하시는 분도 많이 계시지만 둘을 분리한 것보다 ViewController가 길어질 수밖에 없습니다.

예를 들어, 오토 레이아웃, addSubview는 굳이 ViewController에 있을 필요가 없지만 ViewController의 코드를 길게 하는 주범이죠.

ViewController에서 View를 분리하면 역할이 명확해지고 코드가 짧아진다는 장점이 있습니다.

 

View를 분리하는 방법

ViewController에는 viewDidLoad( ) 뿐만 아니라 loadView( )라는 라이프 사이클이 존재합니다.

loadView( )는 ViewController의 메인 뷰가 load 될 때 호출되는 메서드입니다.

viewDidLoad( )는 이 뷰가 모두 생성되고 메모리에 올라갔을 때 호출되는 메서드입니다.

 

저희는 loadView( )에서 ViewController의 view를 교체할 것입니다.

 

View 생성하기

화면의 View를 구성하는 class를 작성합니다.

이 class는 UIView를 상속합니다.

final class MoreView: UIView {
    
    //MARK: - Views
    var tableView: UITableView!
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setup()
    }
    
    private func setup() {
        setupTableView()
    }
    
    private func setupTableView() {
        tableView = UITableView()
        
        ...
        
        self.addSubview(tableView)
        
        tableView.widthAnchor.constraint(equalTo: self.widthAnchor).isActive = true
        ...
    }
}

대략 이렇게 작성할 수 있습니다.

ViewController에 있지 않아도 되는 View에 대한 세팅과 긴 오토 레이아웃 코드를 옮겼습니다.

 

view 교체하기

View를 생성하고 ViewController의 View를 교체해 봅시다.

class MoreViewController: BaseViewController {

    var moreView: MoreView!
    
    //MARK: - Life Cycles
    override func viewDidLoad() {
        super.viewDidLoad()
        
        ...
    }
    
    override func loadView() {
        super.loadView()
        
        moreView = MoreView(frame: self.view.frame)
        self.view = moreView
    }
}

loadView( )를 오버라이드하여 view를 교체합니다.

View 클래스를 생성할 때 frame을 전달하여 자동으로 사이즈가 조절되도록 했습니다.

 

View를 분리하니 ViewController가 획기적으로 줄어들었습니다.

이후엔 여기에 뷰를 컨트롤하는 코드가 들어가겠죠?

View와 Controller가 분리되어 서로의 역할이 더 명확해질 것입니다.

 

감사합니다!

 

 

참고

iOS Developers KR 재르시 님의 채팅

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621454-loadview

https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload

https://medium.com/yay-its-erica/viewdidload-vs-loadview-swift3-47f4ad195602 


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

 

반응형