1
1

More than 3 years have passed since last update.

TableViewのCell再利用について

Posted at

はじめに

TableViewはスクロールするたびに新しいCellを作っているわけではないみたいです。
勉強始めたてのころはCellが新しく作られているのか、それとも再利用されているのかという疑問も持たないかもしれません。(私がそうでした)
しかし、実際に使っていく中で、この辺りを理解しておいた方がいいと思い知らされたので記事を書いてみます。

なぜ再利用するか

パフォーマンスが低下するから!みたいです。
新しいCellを作成していたら、スクロールすればするほどCellが作成されるのでよくないみたいです!(100個も200個も作ってられない)
再利用の場合、画面の外に行ったCellを使うことで必要なCellの数が抑えられるからです。

セルの登録

カスタムセルをコードで書く場合は
register(_:forCellReuseIdentifier:)
をviewDidLoadなどで呼んで登録しておく必要があるみたいです。
Storyboard上でカスタムセルを定義している場合はいらないらしいですよ。
この登録はreuseIdentifierにIDを入力してIDで管理することができます。
(画像のIdentifier)
スクリーンショット 2020-11-16 6.56.40.png

セルを再利用する

ここからが本題です。
実際にセルを再利用する時は、スクロールして画面表示外からセルが現れる時です。
ですので、セルを生成するための処理の中に再利用のコードを書く必要があるわけです。
セルが作成されるのは
tableView(_:cellForRowAt:)
の中です。
この中にセルを再利用するコード
dequeueReusableCell(withIdentifier:for:)
を書いて、セルを生成する時に再利用できるセルがあれば再利用してください🙇‍♂️っていう指示を書きます。
この時の再利用可能なセルはreuseIdentifierで紐付けしたものになります。

画面外に行った再利用待ちのセルはどこへ?

Reuse QueueというものをtableViewは持っていて、これはreuseIdentifierごとに存在しています。
上の画像で言うと、IdentifierがCell1なのでCell1用のReuse Queueが存在しています。
再利用できるものをID別で入れておく在庫置き場の様なものですね。
画面外に行くと、セルは自分のIDのReuse Queueの中に入り、同じIDのセルが必要になった時に取り出されます。

セルは再利用したいけど、セルの内容に変更の処理を行いたい時

セルの見た目が変更されたままReuse Queueの中に入り、変更が残ったまま再利用されることがあります。
そこで使用するのが
prepareForReuse()
です。
ここにセルの変更内容を初期状態に戻す処理を書くことで、初期状態のセルを再利用することができます。

最後に

セルの再利用についての記事を書きました。
tableViewは頻繁に使うので仕組みも理解していた方が良いそうです。
今回初めてQiitaで記事を書いてみたので良いアウトプットになりました。
間違っている箇所などありましたらご指摘ください。
わかりやすいコード例とかができましたらまた載せていきます。

参考記事

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1