2016-07-26 11 views
0

Ich habe ein Problem mit UITableView. Tatsächlich ist unterhalb Code funktioniert gut else tableview. Wenn ich in meinem Projekt auf den Button klicke, wurde ein neuer View-Controller geöffnet. Der neue View-Controller hatte eine UITableView, um Tabellenansichtsdaten dynamisch von JSON zu laden. Problem ist, dass die TableView-Daten nicht angezeigt werden, wenn ich auf die Schaltfläche klicke. Es erscheint leerer weißer Bildschirm. Dann klicke ich irgendwo im View-Controller, dann werden plötzlich die Tabellenansichtsdaten angezeigt. Ich repariere dieses Problem? Danke im Voraus!TableView wird neu geladen Aber nicht angezeigt, wenn ich nicht auf ViewController in Swift 2.0 klicke?

-Code habe ich

import UIKit 

class Events: UIViewController,UITableViewDelegate,UITableViewDataSource { 


    @IBOutlet var tableView: UITableView! 


    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     retrieveDataFromJASON() 

    } 

    var events : [[String: AnyObject]] = [[String: AnyObject]]() 
    var dateAndTime : [[String: AnyObject]] = [[String: AnyObject]]() 

    func retrieveDataFromJASON() 
    { 
     let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call") 
     let requestURL = NSMutableURLRequest(URL: URL!) 
     requestURL.HTTPMethod = "POST" 

     let postString = "api=event_list" 

     requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY") 
     requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

     let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL) { data, response, error in 

      guard error == nil && data != nil else { 
       print("error=\(error)") 

       return 

      } 

      if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { 

       print("statusCode should be 200, but is \(httpStatus.statusCode)") 

       print("response = \(response)") 


      } 

      let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 

      //print(responseString2) /*prints whole JSON Data*/ 
      self.events = (responseString2["event_listing"] as? [[String: AnyObject]])! 
      self.tableView.reloadData() 


      //print(self.events[0]["event_details"]) 
     } 

     task.resume() 
    } 


    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) as! EventTableViewCell 
     cell.eventName.text = events[indexPath.row]["event_details"] as? String 
     cell.eventDate.text = events[indexPath.row]["modified_date"] as? String 
     cell.eventTime.hidden = true 
     cell.rowNumber.text = String(indexPath.row+1) 
     return cell 
    } 

screenshot1 versuchen: Zunächst keine Daten gezeigt (nach den 15 Sekunden gezeigt) enter image description here

sceenshot2. Die Tabellenansicht zeigt die Daten auf einmal, wenn ich es klicken (unten 2 Sekunden)

enter image description here

Antwort

1

Sie müssen die Aktivitätsanzeige in Ihrer Ansicht hinzuzufügen zu zeigen, dass es Anforderung verarbeitet und auch die tableView in Haupt-Thread neu zu laden.

Erste activityIndicator Instanz und diese 2-Methode ist in Ihrem Viewcontroller

var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView() 

func activityIndicatorBegin() { 
    activityIndicator = UIActivityIndicatorView(frame: CGRectMake(0,0,50,50)) 
    activityIndicator.center = self.view.center 
    activityIndicator.hidesWhenStopped = true 
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.Gray 
    view.addSubview(activityIndicator) 
    activityIndicator.startAnimating() 
    disableUserInteraction() 

    greyView = UIView() 
    greyView.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height) 
    greyView.backgroundColor = UIColor.blackColor() 
    greyView.alpha = 0.5 
    self.view.addSubview(greyView) 
} 

func activityIndicatorEnd() { 
    self.activityIndicator.stopAnimating() 
    enableUserInteraction() 
    self.greyView.removeFromSuperview() 
} 

Jetzt rufen Sie diese Methode in Ihrem retrieveDataFromJASON wie auf diese Weise

func retrieveDataFromJASON() { 
    self.activityIndicatorBegin() 
    let URL = NSURL(string: "http://portal.shineevents.co.in/portal/api_load/app_load_call") 
    let requestURL = NSMutableURLRequest(URL: URL!) 
    requestURL.HTTPMethod = "POST" 

    let postString = "api=event_list" 

    requestURL.addValue("123456", forHTTPHeaderField: "X-API-KEY") 
    requestURL.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(requestURL) { data, response, error in 
     activityIndicatorEnd() 
     guard error == nil && data != nil else { 
      print("error=\(error)") 

      return 

     } 
     if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 { 
      print("statusCode should be 200, but is \(httpStatus.statusCode)") 
      print("response = \(response)") 
     } 
     let responseString2 = try! NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 
     //print(responseString2) /*prints whole JSON Data*/ 
     self.events = (responseString2["event_listing"] as? [[String: AnyObject]])! 
     dispatch_async(dispatch_get_main_queue()) { 
      self.tableView.reloadData() 
     } 
     //print(self.events[0]["event_details"]) 
    } 
    task.resume() 
} 

Hinweis hinzufügen - Wenn Sie diese Anzeige verwenden, in mehr als einem Controller als für diese Überprüfung dieser answer wird es Ihnen helfen.

+0

Wow große antwort.auch das Hinzufügen von Aktivität Indikator ist superb.thanks Mr. Nirav :) –

+1

Willkommen Kumpel, Happy Coding :) –

0

Sieht aus wie Sie das Update auf dem mai versenden müssen n thread:

dispatch_async(dispatch_get_main_queue(),{ 
    self.events = (responseString2["event_listing"] as? [[String: AnyObject]])! 
    self.tableView.reloadData() 
}) 

Vom Apple documentation

Der Abschluss-Handler aufzurufen, wenn die Lastanforderung abgeschlossen ist. Dieser Handler wird in der Delegatenwarteschlange ausgeführt.

+0

Es genügt, nur self.tableView.ReloadData() in den Hauptwarteschlangenblock zu setzen. –

1

Sie müssen die Aktualisierung auf dem UI-Thread vornehmen. Dazu müssen Sie den Anruf in die Hauptwarteschlange stellen, die Sie mit dispatch_async() erhalten können. so müssen Sie tun:

dispatch_async(dispatch_get_main_queue()) { 
    self.table.reloadData() 
} 
+0

es funktioniert! Danke Mr.Mayank Baiswar! kleine Änderung von meiner Frage in dieser Antwort 'self.tableView.ReloadData()': D –

+0

ohh Entschuldigung! Ich meinte das IBOutlet, das Sie aus TableView gemacht haben. –

+0

mmm das ist okay: D ich habe es :) thankz –

Verwandte Themen