prepareForReuse()に書くべきコード

iOSアプリ開発において、UITableViewCellやUICollectionViewCellは頻繁に使用されますが、セルの再利用って難しいですよね。先日、セルの初期化タイミングってこれで良いのだっけと思いつつ、なんとなくprepareForReuse()メソッド内にセルの初期化処理を書いていました。

「とりあえずprepareForReuse()に初期化処理を書いとけば良いや」

と私と同じように何となく書いていた方は少なくないのではないでしょうか。

この記事では、セルの再利用時の初期化方法について、

  1. 再利用時によく使うprepareForReuse()のドキュメントを改めて読む
  2. セルの初期化処理の書き方の一例を紹介

の順に解説します。

この記事を読んだ機会に、セルの初期化を迷わずに書いていきましょう!

prepareForReuse()

テーブルビューのデリゲートが再利用できるように、再利用可能なセルを準備します。

https://developer.apple.com/documentation/uikit/uitableviewcell/1623223-prepareforreuse

UITableViewCellオブジェクトに再利用識別子がある場合、テーブルビューは、UITableViewメソッドdequeueReusableCell(withIdentifier:)からオブジェクトを返す直前に、このメソッドを呼び出します。潜在的なパフォーマンスの問題を避けるために、コンテンツに関連しないセルの属性、例えば、透明度、編集・選択状態などのみをリセットする必要があります。tableView(_:cellForRowAt:) のテーブルビューのデリゲートは、セルを再利用するとき、常にすべてのコンテンツをリセットする必要があります。

とそのまま訳しただけですが、これによるとprepareForReuse()内で初期化するべきは、セル自体の属性のみに留める必要があり、コンポーネントの初期化は避けた方が良く、セル上のコンポーネントの初期化はtableView(_:cellForRowAt:)で行えば良さそうです。

初期化の実装例

先述しましたが、セルの属性はprepareForReuse()内で、それ以外はtableView(_:cellForRowAt:)内で初期化処理を書きます。

上のように、3つのUILabelコンポーネントをtableView(_:cellForRowAt:)で初期化したい場合は、publicなメソッドとして用意してあげるとViewController側で使用できます。

以上です。単にドキュメントに従おうという話ですが、意外と気にせず書かれているのを見かけるので今後は注意したいと思います。 (どれくらいパフォーマンスに影響するかは調べられておらずです🙇‍♂️)

参考文献

この記事は、以下の情報を参考に書いています。

NO IMAGE
最新情報をチェックしよう!