2017-01-02 1 views
1

habe ich eine Tableview, in dem ich möchte Nachrichten setzen diesen LinkWie füllt man die Tabelle mit JSON-Daten in Swift 3?

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

Es gibt drei Dinge, die ich will den Tisch bekommen und zu füllen.

String title 
    String text 
    String link 

Hier ist meine Klasse

import Alamofire //Framework for handling http requests 
    import UIKit 

/A-Klasse, die HTTP-Anfragen verarbeiten wird, die Nachricht als String empfangen und das Array mit solchen Daten füllen, die in einer Tabelle angezeigt werden/ Klasse 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. 
} 

}

Später werde ich versuchen, das Bild auch zu bekommen, aber im Moment sollten diese drei Variablen ausreichen.

+0

Warum haben Sie zwei Methoden ('extractData' und' downloadData'), dass machen beide dasselbe? Warum werden beide von 'viewDidLoad' aufgerufen? Warum lädt keiner der beiden den Tisch neu? – rmaddy

+0

@rmaddy Ich dachte, dass es notwendig ist, sie von viewDidLoad aufzurufen. Es liegt an meiner Unerfahrenheit, da ich neu in der Entwicklung mobiler Apps bin. Bitte erklären Sie mir, wie Sie mein Problem lösen können. –

Antwort

1
  • allererst eine benutzerdefinierte struct für die Daten erstellen

    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"] ?? "" 
        } 
    } 
    
  • Die Datenquelle Array ist

    var newsData = [News]() 
    
  • Verwenden nurdownloadData(), die andere Methode löschen.
    eine benutzerdefinierte Struktur der Parsing Verwendung ist ganz einfach:

    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() 
         } 
        } 
    } 
    
  • In cellForRow... Anzeige der Titel

    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 
    } 
    
Verwandte Themen