117 lines
4.5 KiB
Swift
117 lines
4.5 KiB
Swift
//
|
|
// 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: UITableViewCell>(_: T.Type) {
|
|
register(T.self, forCellReuseIdentifier: T.defaultReuseIdentifier)
|
|
}
|
|
|
|
func register<T: UITableViewCell>(_: 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: UITableViewHeaderFooterView>(_: T.Type) {
|
|
register(T.self, forHeaderFooterViewReuseIdentifier: T.defaultReuseIdentifier)
|
|
}
|
|
|
|
func register<T: UITableViewHeaderFooterView>(_: 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: UITableViewCell>() -> 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: UITableViewHeaderFooterView>() -> 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<T: UITableViewCell>(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: UICollectionViewCell>(_: T.Type) {
|
|
register(T.self, forCellWithReuseIdentifier: T.defaultReuseIdentifier)
|
|
}
|
|
|
|
func register<T: UICollectionViewCell>(_: 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: UICollectionReusableView>(_: T.Type, forSupplementaryViewOfKind kind: String) {
|
|
register(T.self, forSupplementaryViewOfKind: kind, withReuseIdentifier: T.defaultReuseIdentifier)
|
|
}
|
|
|
|
func register<T: UICollectionReusableView>(_: 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<T: UICollectionViewCell>(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<T: UICollectionReusableView>(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
|
|
}
|
|
}
|