2017-10-26 8 views
0

私が問題を述べる前に、誰もが私がSwiftのコーディング環境に慣れていないことを知らせたいと思っています。知識の不足で私を許してください。現在、JSON URLから返されたデータに基づいて、Alamofireを使用してテーブルビューのセルにデータを入力する際に​​問題が発生しています。シミュレータでアプリを実行すると、データがコンソールに表示されますが、アプリがSIGABRTエラーでクラッシュします。参考のために、内部にtableview要素を持つviewcontrollerを使用する代わりに、私はtableviewcontrollerを使用しています。ここに私のコードは、これまでのところです:AlamofireのJSONデータをテーブルビューに取り込むにはどうすればよいですか?

import UIKit 
import Alamofire 

class TableViewController: UITableViewController { 
    var responseArray: NSArray = [] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     Alamofire.request("https://rss.itunes.apple.com/api/v1/us/apple-music/top-songs/all/10/explicit.json").responseJSON { response in 
      if let json = response.result.value { 
       print(json) 
       self.responseArray = json as! NSArray 
      } 
     } 
    } 

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "top10", for: indexPath) 

     // Configure the cell... 
     let whichSong = responseArray[(indexPath as NSIndexPath).row] 
     let artistName = (whichSong as AnyObject)["artistName"] as? String 
     cell.textLabel?.text = artistName 

     return cell 
    } 
+0

正確にエラーを引き起こしている行はどれですか?コンソールの完全なエラーメッセージは何ですか? – rmaddy

+0

はStoryboardまたはXIBを使用していますか? –

+0

私はXcodeで提供されているストーリーボードを使用しています。エラーについては、self.responseArray = jsonから来ているようです! NSArray。また、jsonリクエスト後にデータをリロードする必要がありますか? –

答えて

1

JSONのルートオブジェクトは、({}によって表される)辞書ない配列であるため、クラッシュが発生します。

まず第一に、ネイティブ型としてJSON辞書の配列をJSON辞書とデータ・ソース列の型の別名を宣言:

typealias JSONDictionary = [String:Any] 
var responseArray = [JSONDictionary]() 

その後、JSONを解析し、テーブルビューをリロードし、あなたはおそらくしたいですキーresultsの配列:次に

Alamofire.request("https://rss.itunes.apple.com/api/v1/us/apple-music/top-songs/all/10/explicit.json").responseJSON { response in 
     if let json = response.result.value as? JSONDictionary, 
     let feed = json["feed"] as? JSONDictionary, 
     let results = feed["results"] as? [JSONDictionary] { 
      print(results) 
      self.responseArray = results 
      self.tableView.reloadData() 
     } 
} 

cellForRow

let song = responseArray[indexPath.row] 
cell.textLabel?.text = song["artistName"] as? String 
でデータを表示します10
+0

これはエラーを取り除きましたが、何も印刷されていないように見え、テーブルビューにデータが表示されていません。 –

+0

私の悪いですが、キー 'feed'のルートオブジェクトがあります。私は答えを更新しました。 – vadian

+0

これは完璧に機能しました、ありがとうございました。回答が更新されました! –

-1

let cell = tableView.dequeueReusableCell(withIdentifier: "top10") 
+1

この変更では、 'cell'はオプションで' nil'でもかまいません。それをチェックし、必要に応じてセルを作成するには、追加コードを追加する必要があります。この回答は、OPがエラーの詳細を投稿するまでは時期尚早です。 – rmaddy

+1

それを示唆しないでください。 'dequeueReusableCell(withIdentifier:for:)'は、常にオプションの有効でないセルを返すので、推奨APIです。 – vadian

0

わかりましたので、最初に変更して以下の行

let cell = tableView.dequeueReusableCell(withIdentifier: "top10", for: indexPath) 

を交換し

let cell = tableView.dequeueReusableCell(withIdentifier: "top10", for: indexPath) 

let cell = tableView.dequeueReusableCell(withIdentifier: "top10") 

ただし、cellcell?となりますので、cell!を返す必要があります。

あなたAlamofire応答に続いて、

if let json = response.result.value { 
    print(json) 
    self.responseArray = json as! NSArray 
    self.reloadData() 
    //If above line doesn't work, try tableView.reloadData() 
} 

なぜ?

Alamofireのリクエストは「非同期」です。つまり、アプリケーションが他のことをしている間にコードを実行します。そのため、あなたのテーブルは、ロードされた後、あなたがその配列を設定していると思われるので、reloadData()

+2

それを示唆しないでください。 'dequeueReusableCell(withIdentifier:for:)'は、常にオプションの有効でないセルを返すので、推奨APIです。それは問題に関連していません。 – vadian

関連する問題