📱 UITableView manager framework for iOS.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Assets
Sample
TableFlow
.gitignore
LICENSE.md
README.md
TableFlow.podspec
_config.yml

README.md

TableFlow

Version Author Build Passing Swift
Platforms MIT
Cocoapods Carthage SPM


What's this?

TableFlow is a UITableView manager.

Requirements

  • iOS 8.0+
  • Xcode 9 with Swift 4

Installation

CocoaPods

pod 'TableFlow'

Contribution

You are welcome to fork and submit pull requests.

License

TableFlow is open-sourced software, licensed under the MIT license.

Usage

Define a cell:

import UIKit
import TableFlow

open class SiteInfoTableViewCell: UITableViewCell, DeclarativeCell {

    public typealias T = Site
    
    @IBOutlet weak var urlLabel: UILabel!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var iconView: UIImageView!
    
    public func configure(_ site: Site, path: IndexPath) {
        self.titleLabel.text = site.name
        self.urlLabel.text = site.url
        self.iconView.image = site.icon.image
    }
    
    open override func awakeFromNib() {
        super.awakeFromNib()
        self.layoutMargins = UIEdgeInsets.zero
        self.separatorInset = UIEdgeInsets.zero
    }
    
}

and models:

import Foundation
import UIKit

public enum Image {
    case named(String)
    case none
    
    public var image: UIImage? {
        switch self {
        case let .named(name):
            return UIImage.init(named: name)
        default:
            return nil
        }
    }
}

public struct Site {
    public let name: String
    public let url: String
    public let icon: Image
}

now go:

import UIKit
import TableFlow

class ViewController: UITableViewController {

    lazy var manager: TableManager = {
        return TableManager.init(table: self.tableView)
    }()
    
    var dataSource: [Site] = []
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.tableFooterView = UITableViewHeaderFooterView.init()
        
        self.refresh()
    }

    func refresh() {
        self.manager.removeAll()
        self.manager.add(section: self.generateSection())
        self.manager.reloadData()
    }
    
    func fillData() {
        let image = Image.named("avatar")
        self.dataSource.append(Site.init(name: "Github", url: "https://github.com", icon: image))
        self.dataSource.append(Site.init(name: "Google", url: "https://google.com", icon: image))
        self.dataSource.append(Site.init(name: "Twitter", url: "https://twitter.com", icon: image))
        self.dataSource.append(Site.init(name: "Facebook", url: "https://facebook.com", icon: image))
        self.dataSource.append(Site.init(name: "Youtube", url: "https://youtube.com", icon: image))
    }
    
    let SECTION_ID = "SECTION_ID"
    
    func generateSection() -> Section {
        self.fillData()
        
        var rows: [Row<SiteInfoTableViewCell>] = []
        for s in dataSource {
            let row = Row<SiteInfoTableViewCell>.init(model: s)
            row.onTap = { r in
                self.alert(s.name)
                return RowTapBehaviour.deselect(true)
            }
            rows.append(row)
        }
        let section = Section.init(id: SECTION_ID, rows: rows)
        return section
    }
    
    func alert(_ text: String) {
        let controller = UIAlertController.init(title: "Message", message: text, preferredStyle: .alert)
        controller.addAction(UIAlertAction.init(title: "Done", style: .cancel, handler: nil))
        self.present(controller, animated: true, completion: nil)
    }
}