2016-07-26 23 views
0

我有問題UITableView。其實,下面的代碼工作正常,否則表格視圖。在我的項目中,當我點擊按鈕,然後打開新的視圖控制器。新的View控制器有一個UITableView從JSON動態加載tableview數據。問題是當我點擊按鈕時,tableView數據沒有顯示。它看起來空白的屏幕。然後我點擊視圖控制器中的任何地方,然後突然顯示tableview數據。何我解決這個問題?提前致謝!Tableview reloads但不顯示,如果我沒有點擊在Swift 2.0 ViewController的任何地方?

代碼,我嘗試

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:在一開始並未顯示出任何數據(15秒後顯示) enter image description here

sceenshot2:表視圖顯示數據突然當我點擊它(以下2秒)

enter image description here

回答

1

您需要添加活動的指標在視圖中顯示其正在處理請求,並重新加載tableView在主線程。

首先在你的viewController添加activityIndi​​cator實例,這2個方法的現在

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() 
} 

調用這個方法在你retrieveDataFromJASON像這樣

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() 
} 

注 -如果你想利用這些指標在多於一個控制器中,而不是爲此檢查這個answer它會幫助你。

+0

哇很好的答案。即使增加活動指標是superb.thanks Mr.Nirav :) –

+1

歡迎隊友,快樂編碼:) –

0

看起來你需要派遣的邁該更新n個線程:

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

Apple documentation

完成處理負載請求完成時調用。該處理程序在委託隊列上執行。

+0

只需將self.tableView.reloadData()放在主隊列塊中即可。 –

1

您必須在UI線程上進行更新。爲此,您必須將調用放在主隊列中,您可以使用dispatch_async()獲取該隊列。所以,你必須做這樣的:

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

它的工作原理!感謝梅恩貝斯瓦先生!在這個答案'self.tableView.reloadData()'我的問題的小變化':D –

+0

ohh對不起!我的意思是你用tableView製作的IBOutlet。 –

+0

嗯那好吧:我知道了:)謝謝 –

相關問題