// // ReusableView.swift // GXM-CRM // // Created by XUXIAOTENG on 15/12/2017. // Copyright © 2017 GuoXiaoMei. All rights reserved. // import Foundation import UIKit public protocol ReusableView: AnyObject { static var defaultReuseIdentifier: String { get } } public extension ReusableView where Self: UIView { static var defaultReuseIdentifier: String { return NSStringFromClass(self).components(separatedBy: ".").last! } } extension UICollectionReusableView: ReusableView {} extension UITableViewCell: ReusableView {} extension UITableViewHeaderFooterView: ReusableView {} public protocol NibLoadableView: AnyObject { static var nibName: String { get } } public extension NibLoadableView where Self: UIView { static var nibName: String { return NSStringFromClass(self).components(separatedBy: ".").last! } } public extension UITableView { func register(_: T.Type) { register(T.self, forCellReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type) where T: NibLoadableView { let bundle = Bundle(for: T.self) let nib = UINib(nibName: T.nibName, bundle: bundle) register(nib, forCellReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type) { register(T.self, forHeaderFooterViewReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type) where T: NibLoadableView { let bundle = Bundle(for: T.self) let nib = UINib(nibName: T.nibName, bundle: bundle) register(nib, forHeaderFooterViewReuseIdentifier: T.defaultReuseIdentifier) } func dequeueReusableCell() -> T { guard let cell = dequeueReusableCell(withIdentifier: T.defaultReuseIdentifier) as? T else { fatalError("Could not dequeue cell with identifier: \(T.defaultReuseIdentifier)") } return cell } func dequeueReusableHeaderFooterView() -> T { guard let view = dequeueReusableHeaderFooterView(withIdentifier: T.defaultReuseIdentifier) as? T else { fatalError("Could not dequeue header or footer view with identifier: \(T.defaultReuseIdentifier)") } return view } func dequeueReusableCell(for indexPath: IndexPath) -> T { guard let cell = dequeueReusableCell(withIdentifier: T.defaultReuseIdentifier, for: indexPath) as? T else { fatalError("Could not dequeue cell with identifier: \(T.defaultReuseIdentifier)") } return cell } } public extension UICollectionView { func register(_: T.Type) { register(T.self, forCellWithReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type) where T: NibLoadableView { let bundle = Bundle(for: T.self) let nib = UINib(nibName: T.nibName, bundle: bundle) register(nib, forCellWithReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type, forSupplementaryViewOfKind kind: String) { register(T.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: T.defaultReuseIdentifier) } func register(_: T.Type, forSupplementaryViewOfKind kind: String) where T: NibLoadableView { let bundle = Bundle(for: T.self) let nib = UINib(nibName: T.nibName, bundle: bundle) register(nib, forSupplementaryViewOfKind: kind, withReuseIdentifier: T.defaultReuseIdentifier) } func dequeueReusableCell(for indexPath: IndexPath) -> T { guard let cell = dequeueReusableCell(withReuseIdentifier: T.defaultReuseIdentifier, for: indexPath) as? T else { fatalError("Could not dequeue cell with identifier: \(T.defaultReuseIdentifier)") } return cell } func dequeueReusableSupplementaryView(ofKind kind: String, for indexPath: IndexPath) -> T { guard let view = dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: T.defaultReuseIdentifier, for: indexPath) as? T else { fatalError("Could not dequeue supplementary with identifier: \(T.defaultReuseIdentifier)") } return view } }