Skip to content

Instantly share code, notes, and snippets.

@kuotinyen
Last active December 21, 2018 09:44
Show Gist options
  • Save kuotinyen/ef13280324c97327fe561df5919cd57a to your computer and use it in GitHub Desktop.
Save kuotinyen/ef13280324c97327fe561df5919cd57a to your computer and use it in GitHub Desktop.
simplify tableView / CollectionView Cell registration.

Usage

tableView.registerReusableCell(ShowJobTitleInfoCell.self)

Extension

protocol Reusable: class {
    static var reuseIdentifier: String { get }
    static var nib: UINib? { get }
}

extension Reusable {
    static var reuseIdentifier: String { return String(describing: self) }
    static var nib: UINib? {
        let aNib = UINib(nibName: Self.reuseIdentifier, bundle: nil)
        return aNib
    }
}

// ----------------------------------------------------------------------------------
/// TableView
//  MARK: - TableView
// ----------------------------------------------------------------------------------

extension UITableViewCell: Reusable {}
extension UITableView {
    func registerReusableCell<T: UITableViewCell>(_: T.Type) {
        register(T.self, forCellReuseIdentifier: T.reuseIdentifier)
    }
    
    func dequeueCell<T>(forIndexPath indexPath: IndexPath) -> T where T: UITableViewCell {
        return self.dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as! T
    }
    
    func registerReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_: T.Type) where T: Reusable {
        if let nib = T.nib {
            self.register(nib, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
        } else {
            self.register(T.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
        }
    }
    
    func dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>() -> T? where T: Reusable {
        return self.dequeueReusableHeaderFooterView(withIdentifier: T.reuseIdentifier) as! T?
    }
}


// ----------------------------------------------------------------------------------
/// CollectionView
//  MARK: - CollectionView
// ----------------------------------------------------------------------------------

extension UICollectionViewCell: Reusable {}
extension UICollectionView {
    func registerReusableCell<T: UICollectionViewCell>(_: T.Type) {
       register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
    }
    
    func dequeueReusableCell<T: UICollectionViewCell>(indexPath: IndexPath) -> T {
        return self.dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
    }
    
    func registerReusableSupplementaryView<T: Reusable>(elementKind: String, _: T.Type) {
        if let nib = T.nib {
            self.register(nib, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
        } else {
            self.register(T.self, forSupplementaryViewOfKind: elementKind, withReuseIdentifier: T.reuseIdentifier)
        }
    }
    
    func dequeueReusableSupplementaryView<T: UICollectionViewCell>(elementKind: String, indexPath: IndexPath) -> T {
        return self.dequeueReusableSupplementaryView(ofKind: elementKind, withReuseIdentifier: T.reuseIdentifier, for: indexPath) as! T
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment