SwiftTableSpaces
[](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的实现
上述示例说明了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 文件。