2017-08-17 5 views
0

は、私は、このリンクhttps://api.myjson.com/bins/13axs1でサンプルJSONからテーブルビューのセルを移入しようとしているが、textLabelを割り当てるしようとしたときcellForRowAt機能でエラーを取得していますSwift4でCodableプロトコルを使用してJSONデータをTableViewCellに取り込む方法は?

を解決しました。

タイプ '[City]?'持っている何の添字メンバーん

JSON

[ 
    { 
    "name": "New York", 
    "information": "Later will be added", 
    "imageUrl": "later" 
    }, 
    { 
    "name": "New York", 
    "information": "Later will be added", 
    "imageUrl": "later" 
    } 
] 

のViewControllerのコード:

struct City: Codable { 
    let name: String? 
    let information: String? 
    let imageUrl: String? 
} 

class ViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    var citiesList: [City] = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let jsonUrlString = "https://api.myjson.com/bins/13axs1" 
     guard let url = URL(string: jsonUrlString) else { return } 

     URLSession.shared.dataTask(with: url) { (data, response, err) in 

      guard let data = data else { return } 

      do { 
       let cities = try JSONDecoder().decode([City].self, from: data) 

       if cities != nil{ 
        self.citiesList = cities 
       }else { 
        print("nothing to display") 
       } 

       DispatchQueue.main.async { 
        self.tableView.reloadData() 
       } 

      } catch let jsonErr { 
       print("Error serializing json:", jsonErr) 
      } 

     }.resume() 

    } 

} 

extension ViewController: UITableViewDataSource { 
    func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return citiesList.count 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell() 
     cell.textLabel?.text = citiesList[indexPath.row].name // here I am getting error type '[City]? has no subscript members 
     return cell 
    } 
} 

は申し訳ありませんが、すべてのコードはIの後に明確に示していない理由を私は知りませんそれを追加しましたが、皆さんに理解してもらえることを願っています。ありがとうございました。

+0

エラーメッセージを取得している(もしそうなら、あなたのオリジナルのポストでそれを投稿する)、またはデータがあなたのテーブルビューに表示されませんの? – nathan

+0

@nathan、はい、エラーメッセージが表示され、xCodeはプロジェクトをビルドできません。 cellForRowAtで、セルのtextLabelを割り当てようとしたときに、「タイプ」[City]というエラーが発生しましたか?添字のメンバーはありません。 – Julius

+0

回答が更新されました。 – nathan

答えて

0

あなたはリロード法(reloadData())不足している:

URLSession.shared.dataTask(with: url) { (data, response, err) in 

    guard let data = data else { return } 

    do { 
     let cities = try JSONDecoder().decode([City].self, from: data) 
     self.citiesList = cities 

     DispatchQueue.main.async { 
      self.tableView.reloadData() 
     } 
    } catch { 
     print("Error serializing json:", error) 
    } 

}.resume() 


func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.deque... 
    cell.textLabel?.text = citiesList?[indexPath.row].name 
    return cell 
} 
+0

ありがとうございますが、今、self.tableView.reloadData()の行にある 'tableView(。:numberOfRowsInSection)'エラーの 'あいまいな参照'が発生し、プロジェクトをビルドできません。 – Julius

+0

あなたのテーブルビュー変数は何ですか? – nathan

+0

ああ、私はテーブルビューの変数を作るのを忘れていました。今度は作成しましたが、エラーでクラッシュしましたが、 'numberOfRowsInSection関数が存在する行戻りcitiesList!countでOptional値をアンラップしている間に、予期せず見つからなかった。 – Julius

関連する問題