새로운 사이드 프로젝트를 하고 있는데, 거기서 사용해볼 BaseViewController에 대해서 글을 작성해겠다. 이번 프로젝트에서는 내가 해보지 않았던 것들을 조금씩 도전해보면서 만들어볼 예정이다... 그런데 조금 개발 기간이 촉박...해서...걱정이 ...,,, 씁...
🟠 BaseViewController란?
BaseViewController는 커스텀 뷰 컨트롤러이다. 기본적으로 UIKit으로 뷰를 만들게 되면 UIViewController를 상속받게 되는데, 이 UIViewController대신 내가 만든 BaseViewController를 상속받게 하면된다.!
그래서 원래는
makeview <- UIViewController
이렇게 상속받게되는게
makeView <- BaseViewController <- UIViewController
이렇게 상속받게끔 만드는 것이다.
🟠 쓰면 좋은 이유? 장점?
더 귀찮지 않냐고? 왜 쓰는걸까? 쓰는 이유는 크게 두가지로 나뉜다.
1. 코드의 중복을 줄이기 위해서
2. 코드의 통일성을 위해서
코딩을 하다보면 매 view 마다 꼭 넣어줘야하는 부분이 생긴다. 즉, 중복되는 코드가 생긴다 무조건!
- 내가 만든 앱의 백그라운드가 red 라서 뷰마다 색상을 지정해줘야한다던가
- snapkit 과 같이 라이브러리를 뷰 컨트롤러마다 import해주어야 한다던가
- RxSwift를 사용한다면, disposeBag을 매 뷰마다 또 작성해줘야 한다던가
- navigationbar을 뷰마다 넣어주어야 한다던가
- 키보드를 내려주는 코드를 작성해주어야한다던가
이런식으로 코드의 중복이 분명히,, 생기게 된다. 이런 것들을 BaseViewController에 미리 넣어주고, 이 BaseViewController를 상속받아 사용하면, 더이상 이런 코드들을 여러번 쓰지 않아도 된다는 장점이 존재하게 된다.!
저런 경우들 말고도, UIAlertController를 띄워준다던지, 로그인 여부를 체크하여 이동하는 등의 필요한 공통기능을 BaseViewController에 넣을 수 있다.
extension BaseViewController {
func showAlert(
title: String?,
message: String?,
confirmHandler: (() -> Void)? = nil,
completion: (() -> Void)? = nil)
{
let alertView = UIAlertController(title: title, message: message, preferredStyle: .alert)
let confirmAction = UIAlertAction(title: "Confirm", style: .default) { _ in
if let handler = confirmHandler {
handler()
}
}
alertView.addAction(confirmAction)
present(alertView, animated: true, completion: completion)
}
func goToLoginView() {
// 로그인 여부 체크 및 이동
}
}
출처: https://jintaewoo.tistory.com/56 [Decoding Note:티스토리]
또, 코드의 중복을 줄임으로써 코드의 가독성도 올라가게 된다. 특히 View Life Cycle에 자주 작성해주는 뷰를 따로 또 넣어주면서 제약사항에 대한 가독성을 높여준다.
두번째로, 협업할 때 코드의 통일성을 가져다준다.
어떤 사람은 autoLayout을 설정할때 'render'라는 함수에 작성하고, 어떤사람은 layout()함수라고 지정해서 작성하게 된다면, 코드를 읽을때 같은 내용의 코드를 다른 내용의 들어있어서 어지럽기도 하다.
이런것들을 BaseViewController에서 잡아주면, override func을 이용해서 동일한 형태의 코드로 작성할 수 있다!
🟠 BaseViewController 만드는 방법
그냥 원하는 위치에다가 new file로 swift파일을 만들어주면된다. UIViewController를 상속받는 class로 말이다.
import UIKit // UIViewCtroller를 상속받기 떄문에 UIKit은 필수입니다.
// 추가로 자주 사용하는 프레임워크 추가해주시면 되요
import RxSwift
import Then
import SnapKit
// BaseViewController는 UIViewController를 상속받습니다.
class BaseViewController: UIViewController {
// 자주 사용하는 프로퍼티를 넣어줘도 되요
// MARK: - Property
var disposeBag = DisposeBag() // 이부분은 rxSwift 관련부분이라 지우셔도 되요.
private(set) var didSetupConstraints = false
// MARK: - Initializing
init() {
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - View Life Cycle
override func viewDidLoad() {
self.view.backgroundColor = .systemBackground
self.view.setNeedsUpdateConstraints()
attribute()
layout()
}
override func updateViewConstraints() {
if !self.didSetupConstraints {
self.setupConstraints()
self.didSetupConstraints = true
}
super.updateViewConstraints()
}
// 따로 사용하고 싶은 메소드를 만들어줍시다.
func attribute() {
// Override point
}
func layout() {
// Override point
}
// 이외에도 공통으로 들어가는 buttonUI 등등을 넣어줄 수 있음
}
📖 Reference
https://jintaewoo.tistory.com/56
https://apple-apeach.tistory.com/30