2017-01-02 8 views
1

は、私は私が取得し、テーブルを移入したい三つのことがありますSwift 3でJSONデータを使って表を塗りつぶす方法は?

https://api.sis.kemoke.net/news 

このリンクを使用してニュースを置くしたいのtableViewを作成しました。ここで

String title 
    String text 
    String link 

は私のクラス

import Alamofire //Framework for handling http requests 
    import UIKit 

/、httpリクエストを処理し、文字列としてニュースを受信し、テーブルに表示されます、このようなデータを持つ配列を記入しますクラスです/ クラスNewsTableViewController:のUITableViewController {

//Array which holds the news 
var newsData:Array<String> = Array <String>() 

// Download the news 
func downloadData() { 
    Alamofire.request("https://api.sis.kemoke.net/news").responseJSON { response in 
     print(response.request) // original URL request 
     print(response.response) // HTTP URL response 
     print(response.data)  // server data 
     print(response.result) // result of response serialization 

     //Optional binding to handle exceptions 
     if let JSON = response.result.value { 
      print("JSON: \(JSON)") 
     } 
    } 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    downloadData() 
    extractData() 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// MARK: - Table view data source 
// Number of sections i table vie 
override func numberOfSections(in tableView: UITableView) -> Int { 
    return 1 
} 

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


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
    cell.textLabel?.text = newsData[indexPath.row] 
    return cell 
} 

// Extract the data from the JSON 
func extractData() { 
    Alamofire.request("https://api.sis.kemoke.net/news").responseJSON { response in 
     debugPrint(response) 

     if let json = response.result.value { 
      print("JSON: \(json)") 
      self.newsData = json as! Array 
     } 
    } 
} 

// MARK: - Navigation 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    // Get the new view controller using segue.destinationViewController. 
    // Pass the selected object to the new view controller. 
} 

}

後で画像を取得しようとしますが、今のところ3つの変数で十分です。

+0

なぜあなたは二つの方法( 'extractData'と' downloadData')を持っていないことどちらも同じことをしていますか?なぜ両方が 'viewDidLoad'から呼び出されますか?どちらか一方がテーブルをリロードしないのはなぜですか? – rmaddy

+0

@rmaddy私はviewDidLoadからそれらを呼び出す必要があると思いました。私はモバイルアプリの開発を初めて熟知しているので、私の未熟さが原因です。私の問題を解決する方法を教えてください。 –

答えて

1
  • まず第一に、データ・ソース・アレイは

    var newsData = [News]() 
    
  • 使用だけdownloadData()、他の方法を削除している

    struct News { 
        let title : String 
        let text : String 
        let link : String 
    
        init(dictionary: [String:String]) { 
        self.title = dictionary["title"] ?? "" 
        self.text = dictionary["text"] ?? "" 
        self.link = dictionary["link"] ?? "" 
        } 
    } 
    
  • データ用のカスタム構造体を作成します。構文解析、構造体のカスタムを使用して
    は非常に簡単です:

    func downloadData() { 
        Alamofire.request("https://api.sis.kemoke.net/news").responseJSON { response in 
         print(response.request) // original URL request 
         print(response.response) // HTTP URL response 
         print(response.data)  // server data 
         print(response.result) // result of response serialization 
    
         //Optional binding to handle exceptions 
         if let json = response.result.value as? [[String:String]] { 
          self.newsData = json.map{ News(dictionary: $0) } 
          self.tableView.reloadData() 
         } 
        } 
    } 
    
  • cellForRow...表示タイトルで

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) 
        let news = newsData[indexPath.row] 
        cell.textLabel?.text = news.title 
        return cell 
    } 
    
関連する問題