I often get confused with the number of delegate methods made available through the CocoaTouch API - particularly for the UITableViewController. I understand the reasoning behind it and I appreciate the amount of control it gives me - however, it can be hassle when I just want a very simple table.

I have created what I call, the SelfManagingTableView which pretty much handles all of the required delegate methods to get basic functionality - there are a couple of override methods to allow for customisation:

    import UIKit

    class SelfManagingTableView: UITableViewController, UITableViewDataSource, UITableViewDelegate {

    var mySelectedRowIndex:NSIndexPath?
    var myCellIdentifier:String = "" //DEFAULT CELL ID
    var myOpenCellHeight:CGFloat = 150 {

        didSet{

            self.tableView.estimatedRowHeight = myOpenCellHeight

            if iOSVersionCheck.isLowerThaniOSVersion("8.0"){

                self.tableView.rowHeight = myOpenCellHeight
            }
        }
    }
    let myClosedCellHeight:CGFloat = 70
    var myDataArray:Array<Dictionary<String, AnyObject>>? {

        didSet{
            tableView.reloadData()
        }
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func viewDidLoad() {

        super.viewDidLoad()

        if iOSVersionCheck.isLowerThaniOSVersion("8.0"){

            self.tableView.rowHeight = myOpenCellHeight
        }else{


            self.tableView.rowHeight = UITableViewAutomaticDimension
        }
        self.tableView.estimatedRowHeight = myOpenCellHeight
        self.tableView.dataSource = self
        self.tableView.delegate = self
    }


    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {

        return 1
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        if let numberOfRows = self.myDataArray?.count {

            return numberOfRows
        }

        return 0
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier(myCellIdentifier, forIndexPath: indexPath) as UITableViewCell

        self.additionalActionForCell(cell, andRowIndex:indexPath.row)

        return cell
    }

    func additionalActionForCell(theCell:UITableViewCell, andRowIndex theRowIndex:Int){


    }

    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        if iOSVersionCheck.isLowerThaniOSVersion("8.0"){

            return myOpenCellHeight
        }

        return UITableViewAutomaticDimension

    }


    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String {
        return ""
    }

    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        return UITableViewAutomaticDimension
    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        self.mySelectedRowIndex = indexPath

        self.doThisWhenRowSelected(indexPath)

        tableView.beginUpdates()
        tableView.endUpdates()
    }

    func doThisWhenRowSelected(theIndexRow:NSIndexPath){

    }

    override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {

    self.doThisWhenRowDeselected(indexPath)
        }

        func doThisWhenRowDeselected(theIndexRow:NSIndexPath){

        }


    }

And here is the iOS version checking class:

    import UIKit

    @objc class iOSVersionCheck {

    class func isHigherThaniOSVersion(versionNumber:NSString)->Bool{

        let currSysVer = UIDevice.currentDevice().systemVersion

        if currSysVer.compare(versionNumber, options: .NumericSearch) != .OrderedAscending {
            return true
        }
        return false
    }

    class func isLowerThaniOSVersion(versionNumber:NSString)->Bool{

        let currSysVer = UIDevice.currentDevice().systemVersion

        if currSysVer.compare(versionNumber, options: .NumericSearch) == .OrderedAscending {

            return true
        }

        return false
    }
}

Then if you want to use this SelfManagingTableView, you just subclass it and override functions where necessary:

    import UIKit

    class ExampleTable : SelfManagingTableView {

    override func viewDidLoad() {
        super.viewDidLoad()
        myCellIdentifier = "exampleCell"

        //Test data
        myDataArray = [["name":"Something", "version":"1"], ["name":"Awesome", "version":"10"]]

        tableView.backgroundColor = UIColor.clearColor()
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None

        self.myOpenCellHeight = 100

    }

    override func additionalActionForCell(theCell:UITableViewCell, andRowIndex theRowIndex:Int){

        theCell.backgroundColor = UIColor.clearColor()

        if let theCellInformation = myDataArray?[theRowIndex]{

            if let myExampleCell = theCell as? ExampleTableCell {

                if  let theName = theCellInformation["name"] as? NSString {

                    myExampleCell.myDescription?.text = theName
                }

                if let theVersion = theCellInformation["version"] as? NSString {

          myExampleCell.myVersionLabel?.text = theVersion
                }
            }
        }
    }
}

Note: "ExampleTableCell" in the example above, is a subclass of UITableViewCell