Skip to content

Instantly share code, notes, and snippets.

@NeilsUltimateLab
Created February 2, 2019 05:41
Show Gist options
  • Select an option

  • Save NeilsUltimateLab/d77b843a117a891c9f6d1ee98f8a8d53 to your computer and use it in GitHub Desktop.

Select an option

Save NeilsUltimateLab/d77b843a117a891c9f6d1ee98f8a8d53 to your computer and use it in GitHub Desktop.
Typesafe wrapper for UITableView/UICollectionView cell registering.
import UIKit
protocol ReusableView: class {
static var reuseIdentifier: String { get }
}
extension ReusableView where Self: UIView {
static var reuseIdentifier: String {
return String(describing: self)
}
}
extension UITableViewCell: ReusableView {}
extension UITableViewHeaderFooterView: ReusableView {}
extension UICollectionReusableView: ReusableView {}
protocol NibLoadableView: class {
static var nibName: String { get }
}
extension NibLoadableView where Self: UIView {
static var nibName: String {
return String(describing: self)
}
static func initFromNib() -> Self? {
guard let view = (Bundle.main.loadNibNamed(nibName, owner: self, options: nil) as? [Self])?.first else {
return nil
}
return view
}
}
extension UIView: NibLoadableView {}
extension UITableView {
func register<T: UITableViewCell>(_ : T.Type) {
register(T.self, forCellReuseIdentifier: T.reuseIdentifier)
}
func registerNib<T: UITableViewCell>(_ : T.Type) {
let reuseIdentifier = T.reuseIdentifier
let nib = UINib(nibName: T.nibName, bundle: nil)
register(nib, forCellReuseIdentifier: reuseIdentifier)
}
func register<T: UITableViewHeaderFooterView>(_ : T.Type) {
register(T.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier)
}
func registerNib<T: UITableViewHeaderFooterView>(_ : T.Type) {
let reuseIdentifier = T.reuseIdentifier
let nib = UINib(nibName: T.nibName, bundle: nil)
register(nib, forHeaderFooterViewReuseIdentifier: reuseIdentifier)
}
func dequeueReusableCell<T: UITableViewCell>(_ : T.Type, for indexPath: IndexPath) -> T? {
return dequeueReusableCell(withIdentifier: T.reuseIdentifier,
for: indexPath) as? T
}
func dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_ : T.Type) -> T? {
return dequeueReusableHeaderFooterView(withIdentifier: T.reuseIdentifier) as? T
}
}
extension UICollectionView {
func register<T: UICollectionReusableView>(_ : T.Type) {
register(T.self, forCellWithReuseIdentifier: T.reuseIdentifier)
}
func register<T: UICollectionReusableView>(_ : T.Type, ofKind kind: String) {
register(T.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: T.reuseIdentifier)
}
func registerNib<T: UICollectionReusableView>(_ : T.Type) {
let reuseIdentifer = T.reuseIdentifier
let nib = UINib(nibName: T.nibName, bundle: nil)
register(nib, forCellWithReuseIdentifier: reuseIdentifer)
}
func dequeueReusableCell<T: UICollectionViewCell>(_ : T.Type, for indexPath: IndexPath) -> T? {
return dequeueReusableCell(withReuseIdentifier: T.reuseIdentifier,
for: indexPath) as? T
}
func dequeueReusableSupplementaryView<T: UICollectionViewCell>(_ : T.Type, ofKind kind: String, for indexPath: IndexPath) -> T? {
return dequeueReusableSupplementaryView(ofKind: kind,
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