2016-08-08 48 views
0

Ich versuche, die Werte aus dem JSON in die Tabellenansicht zu laden. Hier ist mein Code, ich weiß nicht, was ich vermisse? Es zeigt mir eine Liste von leeren Zellen, aber keine Werte.UITableView erstellt leere Zellen und keine Werte von JSON

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

    var tableView: UITableView! 
    let baseURL = “<url>” 
    var items = [UserObject]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let frame:CGRect = CGRect(x: 0, y: 100, width: self.view.frame.width, height: self.view.frame.height-100) 
     self.tableView = UITableView(frame: frame) 
     self.tableView.dataSource = self 
     self.tableView.delegate = self 
     self.view.addSubview(self.tableView) 

     getJSON() 
     dispatch_async(dispatch_get_main_queue(),{ 
      self.tableView.reloadData() 
     }) 
    } 

    //5 rows 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     print("count /(self.items.count)") 
     return self.items.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     var cell = tableView.dequeueReusableCellWithIdentifier("CELL") 
     if cell == nil { 
      cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL") 
     } 
     let user = self.items[indexPath.row] 
     print(self.items) 
     cell!.textLabel?.text = user.name 
     return cell! 
    } 


    func getJSON() { 
     let url = NSURL(string: baseURL) 
     print(url) 
     let request = NSURLRequest(URL: url!) 
     let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
     let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 
      if error == nil { 
       let swiftyJSON = JSON(data: data!) 
       let results = swiftyJSON.arrayValue 
       for entry in results { 
        self.items.append(UserObject(json: entry)) 
       } 
      } else { 
       print("error \(error)") 
      } 
     } 

     task.resume() 
    } 
} 

Bitte beachten Sie, print("count /(self.items.count)") kehrt 4, die aber

korrekt ist
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
//function does not show any print statements. 

} 

Antwort

2

Sie sollten die tableview ‚s reloadData func nach dem Asynchron-Anfrage beendet nennen.

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { 

var tableView: UITableView! 
let baseURL = “<url>” 
var items = [UserObject]() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let frame:CGRect = CGRect(x: 0, y: 100, width: self.view.frame.width, height: self.view.frame.height-100) 
    self.tableView = UITableView(frame: frame) 
    self.tableView.dataSource = self 
    self.tableView.delegate = self 
    self.view.addSubview(self.tableView) 
    getJSON() 
} 

//5 rows 
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    print("count /(self.items.count)") 
    return self.items.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("CELL") 
    if cell == nil { 
    cell = UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "CELL") 
    } 
    let user = self.items[indexPath.row] 
    print(self.items) 
    cell!.textLabel?.text = user.name 
    cell!.detailTextLabel?.text = user.date // UPDATE 
    return cell! 
} 


func getJSON() { 
    let url = NSURL(string: baseURL) 
    print(url) 
    let request = NSURLRequest(URL: url!) 
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 
    if error == nil { 
     let swiftyJSON = JSON(data: data!) 
     let results = swiftyJSON.arrayValue 
     for entry in results { 
     self.items.append(UserObject(json: entry)) 
     } 
     dispatch_async(dispatch_get_main_queue(),{ 
     self.tableView.reloadData() 
     }) 
    } else { 
     print("error \(error)") 
    } 
    } 
    task.resume() 
    } 
} 
1

Ihre Get json Funktion sollte wie sein

func getJSON() { 
    let url = NSURL(string: baseURL) 
    print(url) 
    let request = NSURLRequest(URL: url!) 
    let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) 
    let task = session.dataTaskWithRequest(request) { (data, response, error) -> Void in 
     if error == nil { 
      let swiftyJSON = JSON(data: data!) 
      let results = swiftyJSON.arrayValue 
      for entry in results { 
       self.items.append(UserObject(json: entry)) 
      } 
      dispatch_async(dispatch_get_main_queue(),{ 
     self.tableView.reloadData() 
    }) 
     } else { 
      print("error \(error)") 
     } 
    } 

    task.resume() 
} 

und

dispatch_async(dispatch_get_main_queue(),{ 
     self.tableView.reloadData() 
    }) 

aus Sicht didload entfernen. Ich habe gerade den Code zum Neuladen der Tabellenansicht in den Abschlussbehandler von web service call gesetzt.

+0

Danke, das hat funktioniert! Aber das druckt nur die Zelle! .textLabel? .text = user.name, aber wenn ich cell! .textLabel? .text = user.date tue, dann druckt es das nicht auf tableView .. keine Idee? – fscore

+0

Das können wir nicht untersuchen, weil wir Ihr JSON- oder Benutzermodell nicht kennen. –

+0

@KenanKarakecili user.date existiert also, wenn ich 'cell! .textLabel? .text = user.name' auskommentiere und' cell! .textLabel? .text = user.date' behalte, funktioniert es und umgekehrt, aber nicht beides zusammen – fscore