2017-06-19 6 views
0

Ich habe mir hier eine Reihe anderer Fragen angeschaut, aber ich bin immer noch relativ neu in Swift und es fällt mir schwer, diese Antworten in meinen Kontext zu stellen.Auffüllen einer Tabellenansicht in Swift mit einem JSON-Objekt

Ich habe eine Datenbank von Ereignissen und ich möchte eine Tabellenansicht mit besagten Ereignissen bevölkern. In meinem ‚EventTableViewController‘ habe ich die folgende Funktion:

func HTTPRequestListEvent() { 
    let serverURL = NSURL(string: "http://localhost:8888/public_php/Cake/index.php/event/listevent") 
    let request = NSMutableURLRequest(url:serverURL! as URL) 
    request.httpMethod = "POST" 

    //Create a task to send the post request 
    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 

     if error != nil { 
      print("HTTPRequestError1=\(error)") 
      return 
     } 

     do { 
      if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:AnyObject] { 
       print("1") 
       for (_, value) in json { 
        if let eventItem = value as? [String:AnyObject] { 
         if let eventName = eventItem["EventName"] as? String { 
          print(eventName) 
         } 
         if let eventLocation = eventItem["EventLocation"] as? String { 
          print(eventLocation) 
         } 
        } 
       } 
      } 
     } 
     catch { 
      print("HTTPRequestError2=\(error)") 
     } 
    } 
    task.resume() 
} 

Ich kann aber nicht die JSON Serialisierung scheinen, um zu arbeiten. Es gibt mir keinen Fehler, noch druckt es die '1' aus.

Auch ich will nicht sagen 'print (eventName)', aber das ist alles was ich bisher habe. Was ich will, ist, tun, um so etwas wie:

cell.eventNameLabel.text = eventName 

aber ich bin nicht sicher, wie die Zelle Details in diesem Zusammenhang zu bekommen.

Edit: Mein JSON hat anderswo gearbeitet, aber für singuläre Daten - ich konnte mich anmelden und Benutzer registrieren.

Mit Postbote, erhalte ich die folgenden JSON-Daten von meinem Server:

[{ "Eventname": "Magnificent soir & eacute; e", "Eventlocation": "Hot Tub Kino", "Startdate": "2017 -12-01 "}, {" EventName ":" Splendid-Party "," EventLocation ":" Gazeebo "," StartDate ":" 2017-12-02 "}, {" EventName ":" Magisches Ereignis "," EventLocation ":" Das Ende eines Regenbogens "," StartDate ":" 2017-02-03 "}, {" EventName ":" Leichtes Müll sammeln "," EventLocation ":" Dungeon "," StartDate ":" 2090-01 -04 "}]

+1

Höchstwahrscheinlich ist Ihr JSON kein Wörterbuch. – rmaddy

+0

Können Sie ein Beispiel Ihres JSON hinzufügen? –

+0

@rmaddy was bedeutet das für Laien und was mache ich mit diesen Informationen? – Weirdali

Antwort

0

Erste Sache zuerst. Der Grund, warum Ihr print("1") nicht funktioniert, ist sehr einfach. Sie verwenden eine if let, um den Wert auszupacken, und wenn der Wert null ist, werden Ihre Codes innerhalb der if let übersprungen. In Ihrem Code fügen Sie einfach eine else für Ihre if let hinzu und drucken Sie, und das wird ausgedruckt.

Jetzt zurück zu Ihrer Frage. Der Grund, warum Ihre if let nicht funktioniert, ist die Art, wie Sie Ihre JSON-Zeichenfolge umsetzen. Aus dem Blick auf Ihre JSON-Zeichenfolge haben Sie ein Array auf der obersten Ebene. In Ihrem Code geben Sie das Ergebnis an [String:AnyObject], das ein Dictionary ist. Sie erhalten also null als Ergebnis, weil dieses Casting fehlgeschlagen ist. Um Ihr Problem zu beheben, hier ein funktionierendes Beispiel Ihres Codes:

let str = "[{\"EventName\":\"Magnificent soirée\",\"EventLocation\":\"Hot tub cinema\",\"StartDate\":\"2017-12-01\"},{\"EventName\":\"Splendid party\",\"EventLocation\":\"Gazeebo\",\"StartDate\":\"2017-12-02\"},{\"EventName\":\"Magical event\",\"EventLocation\":\"The end of a rainbow\",\"StartDate\":\"2017-02-03\"},{\"EventName\":\"Slightly rubbish gathering\",\"EventLocation\":\"Dungeon\",\"StartDate\":\"2090-01-04\"}]" 

do { 
    let data = str.data(using: .utf8) 
    if let json = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [Dictionary<String, Any>] { 
     print("1") 
     for oneItemInJsonArray in json { 
      if let eventName = oneItemInJsonArray["EventName"] as? String { 
       print(eventName) 
      } 
      if let eventLocation = oneItemInJsonArray["EventLocation"] as? String { 
       print(eventLocation) 
      } 
     } 
    }else{ 
     print("fail") 
    } 
} 
catch { 
    print("HTTPRequestError2=\(error)") 
} 
Verwandte Themen