实时演示
示例
要运行示例项目
pod try TableviewPaginator
安装
Carthage
TableviewPaginator 通过 Carthage 提供,在 Cartfile
中指定它。
github "ratulSharker/TableviewPaginator" ~> 0.1.0
用法
步骤 1: 在 Swift 中导入 TableviewPaginator
模块。
import TableviewPaginator
步骤 2: 在你的控制器中获取 TableviewPaginator
的引用(例如,tableviewPaginator
)。此示例假设你使用 UIViewController
作为控制器。
private var tableviewPaginator: TableviewPaginator?
步骤 3: 在您的 viewDidLoad
回调中初始化 tableviewPaginator
。请注意,在调用 initialSetup
方法之前,初始化您的 viewModel 类(您从这里向视图控制器提供数据)。
override func viewDidLoad() {
// do all you model setup before initializing the tableviewPaginator
tableviewPaginator = TableviewPaginator.init(paginatorUI: self, delegate: self)
tableviewPaginator?.initialSetup()
}
步骤 4: 现在我们需要实现两个协议 TableviewPaginatorUIProtocol
和 TableviewPaginatorProtocol
。TableviewPaginatorUIProtocol
负责指定正在工作的 tableview
以及一些其他 UI 事情。TableviewPaginatorProtocol
负责让您知道何时加载数据以及加载哪个数据段。将它们放在两个不同的协议中,原因在于,您可能引入一个新的类来实现 TableviewPaginatorUIProtocol
并在控制器中保持 TableviewPaginatorProtocol
的实现。
实现 TableviewPaginatorUIProtocol
extension YourViewController: TableviewPaginatorUIProtocol {
func getTableview(paginator: TableviewPaginator) -> UITableView {
return yourTableview
}
func shouldAddRefreshControl(paginator: TableviewPaginator) -> Bool {
return true
}
func getPaginatedLoadMoreCellHeight(paginator: TableviewPaginator) -> CGFloat {
return 44
}
func getPaginatedLoadMoreCell(paginator: TableviewPaginator) -> UITableViewCell {
if let cell = yourTableview.dequeueReusableCell(withIdentifier: "YOUR_LOAD_MORE_CELL_IDENTIFIER") as? YourLoadMoreCell {
// customize your load more cell
// i.e start animating the UIActivityIndicator inside of the cell
return cell
} else {
return UITableViewCell.init()
}
}
func getRefreshControlTintColor(paginator: TableviewPaginator) -> UIColor {
return yourColorOfChoice
}
}
实现 TableviewPaginatorProtocol
extension YourViewController: TableviewPaginatorProtocol {
func loadPaginatedData(offset: Int, shouldAppend: Bool, paginator: TableviewPaginator) {
// call your data populating method here
// i.e given below
yourViewModel?.fetchData(offset: offset, limit: yourDataFetchLimit, shouldAppend: shouldAppend)
}
}
步骤 5: 现在您必须调用 UITableViewDelegate
、UITableViewDataSource
以及您获取数据的回调中的一些方法。
在 heightForRowAt
中调用 heightForLoadMore
,如下所示。
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
// if the current indexPath should show the Load more cell
// then heightForLoadMore will return a valid height
// height provided in the TableviewPaginatorUIProtocol
if let height = tableviewPaginator?.heightForLoadMore(cell: indexPath) {
return height
}
return yourCellHeight
}
在 scrollViewDidScroll
中将看起来如下。 scrollViewDidScroll
是从 UIScrollViewDelegate
继承的。
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
tableviewPaginator?.scrollViewDidScroll(scrollView)
}
在 numberOfRowsInSection
中调用 rowsIn
,如下所示
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let yourCurrentNumberOfRows
let tableviewPagiantorLoadeMoreCells = (tableviewPaginator?.rowsIn(section: section) ?? 0)
return yourCurrentNumberOfRows + tableviewPagiantorLoadeMoreCells
}
在 cellForRowAt
中调用 cellForLoadMore
,如下所示
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if let cell = tableviewPaginator?.cellForLoadMore(at: indexPath) {
return cell
}
// write your own cell returning logic
}
所有这些实现都非常直接。最后一项任务是让 tableviewPaginator
知道您已成功完成数据获取。这需要一个从您数据获取完成代理/代码块的函数调用。在这里,我假设您通过 viewModel
提供了一个代理,并在您的 viewController
中实现了该代理。必须有说 dataFetched
的方法。实现如下所示
extension YourViewController: YourViewModelProtocol {
func dataFetched(success: Bool, dataCount: Int) {
if success {
tableviewPaginator?.incrementOffsetBy(delta: userCount)
}
tableviewPaginator?.partialDataFetchingDone()
yourTableView.reloadData()
}
}
这里的 dataCount
参数表示新添加的数据数量,更确切地说是新添加的行数。
技巧
TableviewPaginator
是一个纯 Swift 类。如果您打算在单一视图控制器中使用多个分页器(使用用例如,在一个视图中显示两个不同的表格视图,并通过分段控制来切换它们),您可能需要检查传递的paginator
对象来识别哪个分页器正在调用此委托方法。在这种情况下,使用===
标识运算符 来检查引用等价性。- 当您想要知道是否有任何数据获取正在运行时,请使用
YOUR_PAGINATOR.state.dataFetchingRunning
。这个Bool
将让您知道该状态。要检查所有数据(所有页)是否完成,请使用YOUT_PAGINATOR.state.allDataFetchingCompleted
这个Bool
。要了解当前的偏移量,使用state.offset
。
作者
许可证
TableViewPaginator遵循MIT许可证。有关更多信息,请参阅LICENSE文件。