UITableView+Reusable 2.swift 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*********************************************
  2. *
  3. * This code is under the MIT License (MIT)
  4. *
  5. * Copyright (c) 2016 AliSoftware
  6. *
  7. *********************************************/
  8. import UIKit
  9. // MARK: Reusable support for UITableView
  10. public extension UITableView {
  11. /**
  12. Register a NIB-Based `UITableViewCell` subclass (conforming to `Reusable` & `NibLoadable`)
  13. - parameter cellType: the `UITableViewCell` (`Reusable` & `NibLoadable`-conforming) subclass to register
  14. - seealso: `register(_:,forCellReuseIdentifier:)`
  15. */
  16. final func register<T: UITableViewCell>(cellType: T.Type)
  17. where T: Reusable & NibLoadable {
  18. self.register(cellType.nib, forCellReuseIdentifier: cellType.reuseIdentifier)
  19. }
  20. /**
  21. Register a Class-Based `UITableViewCell` subclass (conforming to `Reusable`)
  22. - parameter cellType: the `UITableViewCell` (`Reusable`-conforming) subclass to register
  23. - seealso: `register(_:,forCellReuseIdentifier:)`
  24. */
  25. final func register<T: UITableViewCell>(cellType: T.Type)
  26. where T: Reusable {
  27. self.register(cellType.self, forCellReuseIdentifier: cellType.reuseIdentifier)
  28. }
  29. /**
  30. Returns a reusable `UITableViewCell` object for the class inferred by the return-type
  31. - parameter indexPath: The index path specifying the location of the cell.
  32. - parameter cellType: The cell class to dequeue
  33. - returns: A `Reusable`, `UITableViewCell` instance
  34. - note: The `cellType` parameter can generally be omitted and infered by the return type,
  35. except when your type is in a variable and cannot be determined at compile time.
  36. - seealso: `dequeueReusableCell(withIdentifier:,for:)`
  37. */
  38. final func dequeueReusableCell<T: UITableViewCell>(for indexPath: IndexPath, cellType: T.Type = T.self) -> T
  39. where T: Reusable {
  40. guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else {
  41. fatalError(
  42. "Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self). "
  43. + "Check that the reuseIdentifier is set properly in your XIB/Storyboard "
  44. + "and that you registered the cell beforehand"
  45. )
  46. }
  47. return cell
  48. }
  49. /**
  50. Register a NIB-Based `UITableViewHeaderFooterView` subclass (conforming to `Reusable` & `NibLoadable`)
  51. - parameter headerFooterViewType: the `UITableViewHeaderFooterView` (`Reusable` & `NibLoadable`-conforming)
  52. subclass to register
  53. - seealso: `register(_:,forHeaderFooterViewReuseIdentifier:)`
  54. */
  55. final func register<T: UITableViewHeaderFooterView>(headerFooterViewType: T.Type)
  56. where T: Reusable & NibLoadable {
  57. self.register(headerFooterViewType.nib, forHeaderFooterViewReuseIdentifier: headerFooterViewType.reuseIdentifier)
  58. }
  59. /**
  60. Register a Class-Based `UITableViewHeaderFooterView` subclass (conforming to `Reusable`)
  61. - parameter headerFooterViewType: the `UITableViewHeaderFooterView` (`Reusable`-confirming) subclass to register
  62. - seealso: `register(_:,forHeaderFooterViewReuseIdentifier:)`
  63. */
  64. final func register<T: UITableViewHeaderFooterView>(headerFooterViewType: T.Type)
  65. where T: Reusable {
  66. self.register(headerFooterViewType.self, forHeaderFooterViewReuseIdentifier: headerFooterViewType.reuseIdentifier)
  67. }
  68. /**
  69. Returns a reusable `UITableViewHeaderFooterView` object for the class inferred by the return-type
  70. - parameter viewType: The view class to dequeue
  71. - returns: A `Reusable`, `UITableViewHeaderFooterView` instance
  72. - note: The `viewType` parameter can generally be omitted and infered by the return type,
  73. except when your type is in a variable and cannot be determined at compile time.
  74. - seealso: `dequeueReusableHeaderFooterView(withIdentifier:)`
  75. */
  76. final func dequeueReusableHeaderFooterView<T: UITableViewHeaderFooterView>(_ viewType: T.Type = T.self) -> T?
  77. where T: Reusable {
  78. guard let view = self.dequeueReusableHeaderFooterView(withIdentifier: viewType.reuseIdentifier) as? T? else {
  79. fatalError(
  80. "Failed to dequeue a header/footer with identifier \(viewType.reuseIdentifier) "
  81. + "matching type \(viewType.self). "
  82. + "Check that the reuseIdentifier is set properly in your XIB/Storyboard "
  83. + "and that you registered the header/footer beforehand"
  84. )
  85. }
  86. return view
  87. }
  88. }