Typed, yet Flexible Table View Controller
Switch branches/tags
Nothing to show
Clone or download
Latest commit d65bc54 Oct 23, 2016



Simple view controller that provides a way to configure a table view with multiple types of cells while keeping type safety. To learn what and whys I encourage you to read the associated blog post.


Let's say we want to present a table view controller with four rows: two with text and two with images. We start by creating view data structures that cells will be configurable with:

struct TextCellViewData {
    let title: String

struct ImageCellViewData {
    let image: UIImage

and the cells themselves:

class TextTableViewCell: UITableViewCell {
    func updateWithViewData(viewData: TextCellViewData) {
        textLabel?.text = viewData.title

class ImageTableViewCell: UITableViewCell {
    func updateWithViewData(viewData: ImageCellViewData) {
        imageView?.image = viewData.image

Now to present a table view controller with those cells, we simply configure it in the following way:

import ConfigurableTableViewController


let viewController = ConfigurableTableViewController(items: [
    CellConfigurator<TextTableViewCell>(viewData: TextCellViewData(title: "Foo")),
    CellConfigurator<ImageTableViewCell>(viewData: ImageCellViewData(image: apple)),
    CellConfigurator<ImageTableViewCell>(viewData: ImageCellViewData(image: google)),
    CellConfigurator<TextTableViewCell>(viewData: TextCellViewData(title: "Bar")),

presentViewController(viewController, animated: true, completion: nil)

And ta-da 🎈:

I encourage you to check both the implementation and an example app.


To run the example project; clone the repo, open the project and run ExampleApp target.


iOS 8 and above.


Arkadiusz Holko: