Voice From Space

プログラミングの備忘録とか、趣味の話とか色々。

UITableViewを更新しようとreloadData走らせると表示されてるセルが更新されなかった話

  1. データ通信を非同期で行う
  2. tableViewのセル内はデータ未表示で画面表示
  3. 通信が終わってデータが正常に取得できたらテーブルをリロードして表示する


って処理をやりたいんだけど、データ取得後のリロードがうまくいかない。

正確にはリロードした時、表示されているセルのデータが表示されない。

んでスクロールなりして元のセルに戻ってくると今度は表示された。

データは正常に受信できてる。

 

これの原因が全くわからなくてかなり悩んだ。

 

 

  • TableViewのreloadDataメソッドは、テーブル全体が更新されるんじゃないのか?
  • セクションの高さが0だとcellForRowAtIndexPathが呼ばれないらしい?でも0にはしていない。
  • ただ調べるとreloadData走らせてもcellForRowAtIndexPathが呼ばれてない。
  • 特定の条件でreloadDataが上手く走らないなんてあるのか?リロードするタイミングの問題なのか?

 

 

とか色々考えて、行き着いた先がコレ

blog.livedoor.jp

 

どうやら、セルの再利用に起因するものらしい。

 

この現象の原因は、先ほど述べた「セルの再利用」に起因します。
タイプ2のセルを表示するため再利用するセルは、直前に使用されたセル情報を元に作られます。
その元情報がタイプ1だった場合、タイプ2では再利用された詳細文字列がそのまま使用される事になります。

ほう、と。

いや、よくわからんが、事象が似ている。

一回作って再利用すると、元情報のものが使われるってことかな。

再利用時は制約がかかる領域ができる…みたいなぼんやりした認識。

 

とりあえず、データ受信したらtableViewを再構成したら、

無事表示できるようになった。

 

セルの再利用について、なんとなーくしか頭に入れてなかったけど、ちゃんと知っとこうと思った次第。