UITableViewを更新しようとreloadData走らせると表示されてるセルが更新されなかった話
- データ通信を非同期で行う
- tableViewのセル内はデータ未表示で画面表示
- 通信が終わってデータが正常に取得できたらテーブルをリロードして表示する
って処理をやりたいんだけど、データ取得後のリロードがうまくいかない。
正確にはリロードした時、表示されているセルのデータが表示されない。
んでスクロールなりして元のセルに戻ってくると今度は表示された。
データは正常に受信できてる。
これの原因が全くわからなくてかなり悩んだ。
- TableViewのreloadDataメソッドは、テーブル全体が更新されるんじゃないのか?
- セクションの高さが0だとcellForRowAtIndexPathが呼ばれないらしい?でも0にはしていない。
- ただ調べるとreloadData走らせてもcellForRowAtIndexPathが呼ばれてない。
- 特定の条件でreloadDataが上手く走らないなんてあるのか?リロードするタイミングの問題なのか?
とか色々考えて、行き着いた先がコレ。
どうやら、セルの再利用に起因するものらしい。
この現象の原因は、先ほど述べた「セルの再利用」に起因します。
タイプ2のセルを表示するため再利用するセルは、直前に使用されたセル情報を元に作られます。
その元情報がタイプ1だった場合、タイプ2では再利用された詳細文字列がそのまま使用される事になります。
ほう、と。
いや、よくわからんが、事象が似ている。
一回作って再利用すると、元情報のものが使われるってことかな。
再利用時は制約がかかる領域ができる…みたいなぼんやりした認識。
とりあえず、データ受信したらtableViewを再構成したら、
無事表示できるようになった。
セルの再利用について、なんとなーくしか頭に入れてなかったけど、ちゃんと知っとこうと思った次第。