UIKit 에서 xib 파일을 쓰는 경우…
UIkit 에서 xib 파일을 활용해서 ui를 만든다면 반드시 거쳐줘야 하는 작업이 있죠
바로 nib 파일 등록인데용
class ViewController: UIViewController {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
setNib()
}
private func setNib() {
let nib = UINib(nibName: "CollectionViewCell", bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: "CollectionViewCell")
}
}
위코드처럼 함수를 생성해서 cell 을 등록해 줄 수 있습니다!
앗 코드가 중복된다!
이 nib 등록은 모든 cell 마다 해주어야 해서 ViewController(ViewController 말고도 Collection ViewController, Table ViewController 등등) 를 하나 생성할 때마다 setNib 함수를 매번 생성해야 하는 문제점이 발생했습니다
코드가 중복되어서 효율적이지 않아요!!
자주 쓰는 함수이므로 extension 에 확장시켜서 두면 편할 것 같다는 생각이 들었습니다

우선 해당 함수는 UIViewController, UICollectionViewController, UITableViewController 에서도 쓸 수 있어야해요
UIKit 클래스의 구조를 보면 ViewController가 CollectionViewController, TableViewController 를 상속시키고 있기 때문에 UIViewController 의 extension 에 함수를 선언해주면 될 것 같습니다
(사진에는 안나와있지만 UICollectionViewController 도 UIViewController 를 상속합니다)
// UIKit.UICollectionView
open func register(_ nib: UINib?, forCellWithReuseIdentifier identifier: String) // Collection view cell 전용
// UIKit.UITableView
open func register(_ nib: UINib?, forCellReuseIdentifier identifier: String) // Table view cell 전용
또한 등록하려는 cell 의 타입(UICollectionView / UITableView)에 따라 실행되어야 하는 함수가 다음과 같이 다릅니다
// UIViewController+Extension.swift
extension UIViewController {
func setXib(identifier: String, object: UICollectionView) {
let nib = UINib(nibName: identifier, bundle: nil)
object.register(nib, forCellWithReuseIdentifier: identifier)
}
func setXib(identifier: String, object: UITableView) {
let nib = UINib(nibName: identifier, bundle: nil)
object.register(nib, forCellReuseIdentifier: identifier)
}
}
그래서 UIViewController 에 Extension 으로 setNib 함수를 오버로딩 해주도록 하겠습니다
이렇게 해보고 한번 테스트를 해볼까요?
class ViewController: UIViewController {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
setXib(identifier: "CollectionViewCell", object: collectionView)
}
}
이 코드를 돌려보면 성공적으로 콜렉션 뷰를 업로드 할 수 있었습니다!!
앞으로는 extension 잘 활용해볼 예정입니다 ~