22444


Alamofireを使用してJSONデータを取得した後、そのデータをTableViewにセットして表示させたいのですが、データ取得後もTableViewにデータが表示できません。

[code]

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // 【Alamofire】データをサーバーのDBから取得
        Alamofire.request(
            .GET,
            "http://hogehoge.jp/test.json",
            parameters : ["t" : 1, "c" : 0]
        ).responseJSON{
            (request, response, result) in
            switch result {
                case .Success(let data) :
                    // 取得したデータをJSON型に変換
                    let jsonList = JSON(data)
    
                    for (no, item) in jsonList {
                        // 全てのデータを取り出し、順に配列に格納
                        let testData = TestData()
                        testData.id = item["id"].asString!
                        testData.name = item["name"].asString!
                        testData.title = item["title"].asString!
                        self.testList.append(testData)
                    }
    
                    // テーブルビューにデリゲートとデータソースを設定
                    self.testListTableView.delegate = self
                    self.testListTableView.dataSource = self
    
                case .Failure(let data, let error) :
                    print((error as! NSError).localizedDescription)
            }
        };
    }
    
    /**
    * セクションに表示させるカスタムセルを返却
    */
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        // カスタムセルを設定
        let cell = TestListCell()
        cell.setCell(testList[indexPath.row] as! TestData)
    
        return cell
    }
    
[/code]

途中でブレークポイントを置いて確認しましたが、データは正しく取得できており、  
testListの中にもきちんと取得したデータが格納されていました。  
特にエラーが出ているわけでもないので、何をどう直せばいいのかがわかりません。

かなり初歩的な質問で申し訳ありませんが、解決方法を教えてもらえないでしょうか。  
よろしくお願い致します。


CC BY-SA 3.0
2016-02-23T09:12:17.350
22428
2016-02-23T14:15:33.913
14172
question
swift xcode uitableview alamofire
swiftでTableViewのカスタムセルが表示されない


UITableViewの表示は、中身のデータがそろったからといって、勝手にその中身を使った内容に更新してもらえるわけではありません。中身のデータがそろったところで`reloadData()`というメソッドを呼ぶのがお約束です。`realoadData()`を含めUI表示の更新を伴うメソッドは必ずメインスレッドの中で呼ぶのがこれまたお約束ですから、次のような行をswitch文の`case
.Success(let data) :`節の最後(`case .Failure(let data, let error)
:`節の直前)に入れる必要があるでしょう。

[code]

                dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
                }
    
[/code]

その他。

  * 「テーブルビューにデリゲートとデータソースを設定」がデータのロード後である必要はありません。

むしろ別スレッドでそれらを設定した場合、予期せぬ副作用があっては困りますから、`super.viewDidLoad()`の直後に移すべきでしょう。

  * コメントにありますように`tableView(_:cellForRowAtIndexPath:)`の書き方が完全に不合格です。

[iOS Table View
プログラミングガイド](https://developer.apple.com/jp/documentation/TableView_iPhone.pdf)などの正しい作法が記載されたドキュメントや記事を参考にしてください。リンク先のコード例はObjective-
Cですが、UITableViewを使うのであれば、Swiftユーザとしてもmustのドキュメントです。データを更新したら`realoadData()`を呼ぶ必要があることなどもきちんと説明されています。

見える部分だけでもこれだけ突っ込みどころがあるので、最初に書いた事柄を修正しても正しく動くようになるかどうかは大変心配なところです。きちんとしたドキュメントは読むのも大変でしょうが、守るべき作法を守らないと全く思うとおりに動いてくれないというのは経験された通りです。少し遠回りに思えても、基本となるドキュメントにはきちんと目を通すことをお勧めします。


CC BY-SA 3.0
2016-02-23T14:15:33.913
22444
2016-02-23T14:15:33.913
13972
22428
answer