jsdw_ios/QuickLocation/UIKit/ReusableView.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
}
}