【Swift】UITableViewで無限スクロールする方法

UITableViewで無限スクロール

本記事の内容

実行環境

Swift5.6
Xcode13.3

完成物

下の動画のように、無限スクロールするコードを作ってみました。

実装

tableViewを設置した後の全コードは下記のとおりです。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    private var number = 20

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        number
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = String(indexPath.row + 1)
        return cell
    }

    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        DispatchQueue.main.async {
            if indexPath.row == self.number - 10 {
                self.number += 10
                tableView.reloadData()
            }
        }
    }

}

18〜25行目の下記のコードがポイント。
tableViewのreloadDataはバックグランドのスレッドで実行されるらしいので、reloadDataが実行されたときにカクカクします。
そこで、「DispatchQueue.main.async {}」によってreloaddataをメインスレッドで実行させ、ヌルヌルのUIにしています。

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    DispatchQueue.main.async {
        if indexPath.row == self.number - 10 {
            self.number += 10
            tableView.reloadData()
        }
    } 
}

ちなみに、上記のtableViewメソッドが初見の方はこちらの公式リファレンスをどうぞ。
(tableViewが特定の行のセルを描画しようとしていることをデリゲートに通知するメソッドです)

ということで、本記事はUITableViewで無限スクロールする方法を自分のメモ程度にまとめました。
クローンしてローカルで試したい方はこちらのGitHubからどうぞ。
本記事を書いている僕自身は、まだSwift初学者のためコードに至らない点が多いと思います。参考程度にご活用下さい。
アドバイスやコードの改善などあれば本記事の最後の部分からコメントしてくださいね。
最後まで読んでいただきありがとうございました!

おすすめSwift書籍

Swiftを学ぶなら、間違いのない2冊はこちら

Xcodeを学ぶなら下の一冊



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です