CocoaPods Carthage

DataViewable is an extensible, protocol-based framework to make it easy to display empty data sets and loading indicators for any view that is used to display data to users. The DataViewable protocol defines an interface for creating empty data sets. Default implementations in the DataViewable protocol extension provide the bulk of the logic necessary to easily implement empty data sets and loading indicators on any view type. Conditional conformance to the DataViewable protocol allows us to provide useful overrides of the default implementations for various UI elements (UITableView, UICollectionView, UIImageView, UIView, etc...).



Add the line pod "DataViewable" to your Podfile


Add the line github "stablekernel/DataViewable" to your Cartfile


Clone the repo and drag the file files in Sources/ into your Xcode project.

Swift Package Manager:

Add the line .Package(url: "", majorVersion: 0) to your Package.swift


Implement DataViewSource and emptyViewForDataView to return the empty view you wish to display.

extension ViewController: DataViewSource {

  func emptyViewForDataView(_ dataView: DataViewable) -> UIView? {
    let view = EmptyDataView(delegate: self)
    view.imageView.image = #imageLiteral(resourceName: "error_image")
    view.titleLabel.text = "Sorry, no data!"
    view.detailLabel.text = "Something bad happened :("
    view.button.setTitle("Reload", for: .normal)
    return view

extension ViewController: EmptyDataViewDelegate {
  func emptyDataViewWasPressed(_ emptyDataView: EmptyDataView) {
    // Some action

  func emptyDataViewDidPressButton(_ emptyDataView: EmptyDataView) {

  func emptyDataViewDidPressImage(_ emptyDataView: EmptyDataView) {
    // Some action

Set this DataViewSource as the emptyDataSetSource of some DataViewable

@IBOutlet weak var tableView: DataTableView!

override func viewDidLoad() {
  tableView.emptyDataSetSource = self

Set isLoading to true before fetching your data and false when complete. Assign your data and reload your view as you normally would.

func reloadData() {
  tableView.isLoading = true

  Store.fetchData { [weak self] result in

    switch result {
    case .value(let data):
      self?.data = data
    case .error(let error):
      self?.error = error

    self?.tableView.isLoading = false

Platform support

DataViewable supports all current Apple platforms with the following minimum versions:

  • iOS 11
  • OS X: n/a
  • watchOS: n/a
  • tvOS: n/a


  • Swift Tools
View More Packages from this Author


  • None
Last updated: Wed Nov 09 2022 00:01:11 GMT-0500 (GMT-05:00)