2017-12-09 8 views
0

JSONデータをviewCellテーブルに渡すために以下のコードを取得しようとしています。 JSONデータがキャプチャされ、変数downloadLenderRatesに保存されていることを確認しました。しかし、値をTabelView Cellに渡すことはできません。私は、セル識別子が正しく指定されていることを確認し、テーブルビューのセルの管理に役立つ迅速なファイル名が正しく指定されています。この時点で、アプリケーションを実行するとエラーメッセージは表示されず、空白のテーブルが表示されます。なぜわからないのですか?JSONデータがtableView Cellに渡されない

class MortgageRatesVC: UIViewController, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    let mortgousURL = URL(string:"http://mortgous.com/JSON/currentRatesJSON.php")! 
    var lenderRates = [LenderRate]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     downloadJason() 

    } 

    func downloadJason() { 
     lenderRates = [] 


     // guard let downloadURL = url else { return } 
     URLSession.shared.dataTask(with: mortgousURL) { data, urlResponse, error in 
      guard let data = data else { return } 
      do { 
       let dateFormat = DateFormatter() 
       dateFormat.locale = Locale(identifier: "en_US_POSIX") 
       dateFormat.dateFormat = "yyyy-MM-dd" 
       let decoder = JSONDecoder() 
       decoder.dateDecodingStrategy = .formatted(dateFormat) 
       let downloadLenderRates = try decoder.decode([LenderRate].self, from: data) 

       // print(downloadLenderRates) 

       self.lenderRates = downloadLenderRates 

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

      } catch { 
       print(error) 
      } 
     }.resume() 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     return lenderRates.count 

    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     guard let cell = tableView.dequeueReusableCell(withIdentifier: "LenderCell") as? LenderCell else { return UITableViewCell() } 

     cell.lenderNamelbl.text = lenderRates[indexPath.row].financialInstitution 
     print(lenderRates[indexPath.row].financialInstitution) 

     return cell 

    } 

} 
+0

あなたがテーブルビューのデリゲート 'クラスMortgageRatesVCとしてあなたのビューコントローラを設定していることを確認してください:のUIViewController、UITableViewDelegate、UITableViewDataSource {'とviewDidLoadメソッド内で 'tableView.delegate = self' –

+0

あなたのtableView cellForRowAt方法でprint文を追加し、それが呼び出されていることを確認してください。 –

+0

Btwは、downloadLenderRatesオブジェクトを作成する必要はありません。デコードの結果を配列 'self.lenderRates = try decoder.decode([LenderRate] .self、from:data)' –

答えて

0

構文

guard let cell = tableView.dequeueReusableCell(withIdentifier: "LenderCell") as? LenderCell else { 
     return UITableViewCell() 
} 

は非常に悪い習慣です。例えば、開発者がセルのクラスをカスタムクラスに設定するのを忘れた場合に発生するエラーのエラーがある場合にのみ、エラーが発生する可能性があります。この場合、テーブルビューには何も表示されません。

これは、強制アンラッピングが推奨される数少ないケースの1つです。デザインが正しく設定されている場合、セルは有効で、そのタイプはカスタムクラスです。また、非選択的なセルを返すAPI dequeueReusableCell(withIdentifier:for:)を常に使用してください。

let cell = tableView.dequeueReusableCell(withIdentifier: "LenderCell", for: indexPath) as! LenderCell 
+0

ありがとうございました。このコメントは、私が警告を修正するのを助けました:プロトタイプのテーブルセルは再利用識別子 –

関連する問題