質問: TestListCell() cell.setCell(testList[indexPath.row] as! TestData) return cell } ``` 途中でブレークポイントを置いて確認しましたが、データは正しく取得できており、 testListの中にもきちんと取得したデータが格納されていました。 特にエラーが出ているわけでもないので、何をどう直せばいいのかがわかりません。 かなり初歩的な質問で申し訳ありませんが、解決方法を教えてもらえないでしょうか。 よろしくお願い致します。
回答: UITableViewの表示は、中身のデータがそろったからといって、勝手にその中身を使った内容に更新してもらえるわけではありません。中身のデータがそろったところで`reloadData()`というメソッドを呼ぶのがお約束です。`realoadData()`を含めUI表示の更新を伴うメソッドは必ずメインスレッドの中で呼ぶのがこれまたお約束ですから、次のような行をswitch文の`case .Success(let data) :`節の最後(`case .Failure(let data, let error) :`節の直前)に入れる必要があるでしょう。 ``` dispatch_async(dispatch_get_main_queue()) { self.tableView.reloadData() } ``` その他。 * 「テーブルビューにデリゲートとデータソースを設定」がデータのロード後である必要はありません。 むしろ別スレッドでそれらを設定した場合、予期せぬ副作用があっては困りますから、`super.viewDidLoad()`の直後に移すべきでしょう。 * コメントにありますように`tableView(_:cellForRowAtIndexPath:)`の書き方が完全に不合格です。 iOS Table View プログラミングガイドなどの正しい作法が記載されたドキュメントや記事を参考にしてください。リンク先のコード例はObjective-Cですが、UITableViewを使うのであれば、Swiftユーザとしてもmustのドキュメントです。データを更新したら`realoadData()`を呼ぶ必要があることなどもきちんと説明されています。 見える部分だけでもこれだけ突っ込みどころがあるので、最初に書いた事柄を修正しても正しく動くようになるかどうかは大変心配なところです。きちんとしたドキュメントは読むのも大変でしょうが、守るべき作法を守らないと全く思うとおりに動いてくれないというのは経験された通りです。少し遠回りに思えても、基本となるドキュメントにはきちんと目を通すことをお勧めします。