2017-01-02 116 views
1

我創建了一個在的tableView我希望通過此鏈接如何在Swift 3中使用JSON數據填充表格?

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

有三件事情,我想和填充表放消息。

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. 
} 

}

後來我會嘗試獲取圖片,但現在這三個變量應該足夠了。

+0

爲什麼你有兩個方法('extractData'和'downloadData'),其兩者都做同樣的事情?爲什麼都從'viewDidLoad'調用?爲什麼沒有人重新加載表格? – rmaddy

+0

@rmaddy我認爲從viewDidLoad調用它們是很有必要的。這是由於我對手機應用程序開發不熟悉所致,因爲我缺乏經驗。請你解釋一下如何解決我的問題? –

回答

1
  • 首先,創建自定義結構的數據

    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"] ?? "" 
        } 
    } 
    
  • 數據源陣列是

    var newsData = [News]() 
    
  • 使用downloadData(),刪除其他方法。
    使用自定義結構解析很簡單:

    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 
    }