Help us understand the problem. What is going on with this article?

【UITableView】ページング処理のため残りの cell の数を取得する

More than 3 years have passed since last update.

UITableView である程度スクロールしてある程度下端に近づいたら、追加でコンテンツを取得したい、という場合があるとおもいます。いわゆるページング処理です。
そんなときにこんな extension があると簡単にイベントを捕まえることができます。

UITableView+.swift
extension UITableView {
    // 与えられたindexPathの下部のセルの数を返す
    func belowCellsCount(cellIndexPath: IndexPath) -> Int {
        // 全てのセルの数
        let allCellsCount = Array(0 ..< self.numberOfSections).reduce(0) { (sum, sectionIndex) -> Int in
            return sum + numberOfRows(inSection: sectionIndex)
        }
        // `cellIndexPath`の上部のセクションのすべてのセルの数
        let cellsInAboveSectionCount = Array(0 ..< cellIndexPath.section).reduce(0) { (sum, sectionIndex) -> Int in
            return sum + self.numberOfRows(inSection: sectionIndex)
        }
        return allCellsCount - cellsInAboveSectionCount - cellIndexPath.row
    }
}

こんな感じで使えます。

ListViewController.swift
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if tableView.belowCellsCount(cellIndexPath: indexPath) < 6 {
        // 残りのセル数が6を下回った
        // 追加のコンテンツ取得処理
        self.viewModel.fetchList()
    }
}

contentOffset を取得して contentSize を比べることでも似たようなことができますが、デバイスごとにセルのサイズが変わったりする場合に使い勝手が変わってきます。セルの数でページングする方が確実だと思います。
同じ extension を UICollectionView にも実装すると、UICollectionView でも同じことが可能です。

KosukeOhmura
Swift, Ruby on Rails とかやってます。
https://www.kosukeohmura.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away