SwiftTableSpaces 0.1.3

SwiftTableSpaces 0.1.3

AJ Bartocci 维护。



  • 作者:
  • AJ Bartocci

SwiftTableSpaces

[![CI 状态](http://img.shields.io/travis/AJ Bartocci/SwiftTableSpaces.svg?style=flat)](https://travis-ci.org/AJ Bartocci/SwiftTableSpaces) 版本 许可 平台

示例

要运行示例项目,请首先克隆仓库,然后在示例目录中运行 pod install

示例应用实现了一个表视图,充当待办事项列表。用户可以向列表中添加待办事项,这将向“待办事项”部分添加一个单元格。在“待办事项”部分,用户可以标记待办事项为完成或将它从列表中删除。当待办事项被标记为完成时,它将被添加到“已完成待办事项”部分。然后用户可以从“已完成待办事项”部分删除已完成待办事项。

示例应用有 3 个标签页,每个标签页都实现了相同的 ToDo 视图控制器。一个标签页完全实现了 SwiftTableSpaces 并使用 SwiftTableSpaceManager 管理表格视图。另一个标签页完全不使用 SwiftTableSpaces,并在一个巨大的视图中实现所有功能。最后一个标签页使用 SwiftTableSpaces 重新模块化表格视图部分,但不使用 SwiftTableSpaceManager,而是手动使用 UITableViewDataSource 和 SwiftTableViewDelegate。

  • 巨大的视图控制器示例在视图控制器类中使用了 ~ 215 行 代码。
  • 使用 SwiftTableSpaces 和 UITableViewDataSource、SwiftTableViewDelegate 手动使用混合示例的视图控制器类中使用了 ~ 130 行 代码。
  • 带有 SwiftTableSpaceManager 的 SwiftTableSpaces 示例在视图控制器类中使用了 ~ 45 行 代码。

需求

了解如何使用UITableViews,并熟悉UITableViewDataSource和SwiftTableViewDelegate

安装

SwiftTableSpaces可以通过CocoaPods获取。要安装它,只需在Podfile中添加以下行

pod 'SwiftTableSpaces'

用法

SwiftTableSpaces是符合SwiftTableSpaceable协议的类。一个符合SwiftTableSpaceable的类必须实现三个函数

func register(for tableView: UITableView)

此函数应用于注册tableview将要展示的任何nib或类

func numberOfRows() -> Int

此函数返回特定tablespace中的行数。这是包装UITableViewDataSource函数tableView(UITableView, numberOfRows: Int) -> Int的实现

func cell(forRowAt indexPath: IndexPath, in tableView: UITableView) -> UITableViewCell

此函数返回指定indexpath的单元格。这是配置单元格的地方。这是包装UITableViewDataSource函数tableView(_: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell的实现

alt text

上述示例说明了SwiftTableSpaces的作用。在tableview中有两个部分,每个部分由一个tablespace进行配置。创建了一个名为'StringTableSpace'的自定义基本TableSpace,使用每个单元格的字符串来配置单元格。TableSpaceOne和TableSpaceTwo 都是StringTableSpace类的子类。

基本字符串table space类

import SwiftTableSpaces

class StringTableSpace: SwiftTableSpaceable {
    
    typealias Model = String
    typealias Cell = TableSpaceTableViewCell
    let cellId = "TableSpaceTableViewCellId"
    private (set) var models: [Model] = []
    
    func setModels(_ models: [Model]) {
        self.models = models
    }
    
    func numberOfRows() -> Int {
        return models.count
    }
    
    func register(for tableView: UITableView) {
        let nib = UINib(nibName: "TableSpaceTableViewCell", bundle: nil)
        tableView.register(nib, forCellReuseIdentifier: cellId)
    }
    
    func cell(forRowAt indexPath: IndexPath, in tableView: UITableView) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! Cell
        let model = models[indexPath.row]
        cell.titleLabel.text = model
        return cell 
    }
}

TableSpaceOne类

import SwiftTableSpaces

class TableSpaceOne: StringTableSpace {
    
    override func cell(forRowAt indexPath: IndexPath, in tableView: UITableView) -> UITableViewCell {
        let cell = super.cell(forRowAt: indexPath, in: tableView) as! Cell
        cell.titleLabel.textAlignment = .left
        cell.titleLabel.font = UIFont.systemFont(ofSize: 14)
        return cell
    }
}

extension TableSpaceOne: SwiftTableSpaceDefaultHeaderTitleable {
    
    func estimatedHeaderHeight(for tableView: UITableView) -> CGFloat {
        return 25.0
    }
    
    func titleForDefaultHeader(in tableView: UITableView) -> String? {
        return "Space One Default Header"
    }
}

extension TableSpaceOne: SwiftTableSpaceDefaultFooterTitleable {
    func estimatedFooterHeight(for tableView: UITableView) -> CGFloat {
        return 25.0
    }
    
    func titleForDefaultFooter(in tableView: UITableView) -> String? {
        return "Space One Default Footer"
    }
}

TableSpaceTwo类

import SwiftTableSpaces

class TableSpaceTwo: StringTableSpace {
    
    typealias Header = ExampleHeaderFooterView
    let headerId = "ExampleHeaderFooterViewId"
    
    override func cell(forRowAt indexPath: IndexPath, in tableView: UITableView) -> UITableViewCell {
        let cell = super.cell(forRowAt: indexPath, in: tableView) as! Cell
        cell.titleLabel.textAlignment = .right
        cell.titleLabel.font = UIFont.boldSystemFont(ofSize: 18)
        return cell
    }
    
    override func register(for tableView: UITableView) {
        super.register(for: tableView)
        let nib = UINib(nibName: "ExampleHeaderFooterView", bundle: nil)
        tableView.register(nib, forHeaderFooterViewReuseIdentifier: headerId)
        tableView.sectionHeaderHeight = UITableViewAutomaticDimension
    }
    
}

extension TableSpaceTwo: SwiftTableSpaceHeaderConfigurable {
    
    func headerView(for tableView: UITableView) -> UITableViewHeaderFooterView? {
        let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: headerId) as? Header
        header?.titleLabel.text = "Space Two Custom Header View With Long Title To Run Multiple Lines"
        header?.contentView.backgroundColor = .white 
        return header
    }
    
    func estimatedHeaderHeight(for tableView: UITableView) -> CGFloat {
        return 80.0
    }
}

这两个tablespaces继承自StringTableSpace,但遵守不同的协议以改变其外观。TableSpaceOne实现了SwiftTableSpaceDefaultHeaderTitleable和SwiftTableSpaceDefaultFooterTitleable协议,并左对齐单元格文本。TableSpaceTwo实现了SwiftTableSpaceHeaderConfigurable协议,并将单元格文本对齐到右侧并加粗字体。

已经将UITableViewDataSource和UITableViewDelegate的功能分解为更小的、逻辑上相关的协议,这使得可以清楚地看到每个tablespace应该做什么。SwiftTableSpaceDefaultHeaderTitleable、SwiftTableSpaceDefaultFooterTitleable和SwiftTableSpaceHeaderConfigurable就是这样的例子。

作者

AJ Bartocci,[email protected]

许可证

SwiftTableSpaces 可在 MIT 许可证下使用。有关更多信息,请参阅 LICENSE 文件。