TableviewPaginator 0.3.3

TableviewPaginator 0.3.3

Ratul Sharker 维护。



  • Ratul sharker

CI Status codebeat badge Version Carthage compatible License Platform Xcode Swift

实时演示

示例

要运行示例项目

pod try TableviewPaginator

安装

CocoaPods

TableviewPaginator 可以通过 CocoaPods 获取。要安装它,只需将以下行添加到你的 Podfile

pod 'TableviewPaginator' 
Carthage

TableviewPaginator 通过 Carthage 提供,在 Cartfile 中指定它。

github "ratulSharker/TableviewPaginator" ~> 0.1.0
手动方式

TableviewPaginator.swift 文件添加到 Xcode 项目中,即可使用。

用法

步骤 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: 现在我们需要实现两个协议 TableviewPaginatorUIProtocolTableviewPaginatorProtocolTableviewPaginatorUIProtocol 负责指定正在工作的 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: 现在您必须调用 UITableViewDelegateUITableViewDataSource 以及您获取数据的回调中的一些方法。

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 参数表示新添加的数据数量,更确切地说是新添加的行数。

技巧

  1. TableviewPaginator 是一个纯 Swift 类。如果您打算在单一视图控制器中使用多个分页器(使用用例如,在一个视图中显示两个不同的表格视图,并通过分段控制来切换它们),您可能需要检查传递的 paginator 对象来识别哪个分页器正在调用此委托方法。在这种情况下,使用 === 标识运算符 来检查引用等价性。
  2. 当您想要知道是否有任何数据获取正在运行时,请使用 YOUR_PAGINATOR.state.dataFetchingRunning。这个 Bool 将让您知道该状态。要检查所有数据(所有页)是否完成,请使用 YOUT_PAGINATOR.state.allDataFetchingCompleted 这个 Bool。要了解当前的偏移量,使用 state.offset

作者

[email protected]

许可证

TableViewPaginator遵循MIT许可证。有关更多信息,请参阅LICENSE文件。