2016-07-26 2 views
0

UITableViewに問題があります。実際には、以下のコードは、うまく動作しています。私のプロジェクトで、ボタンをクリックすると、新しいView Controllerが開きました。新しいView Controllerには、JSONからテーブルビューデータを動的にロードするためのUITableViewがありました。問題は、ボタンをクリックするとtableViewデータが表示されないことです。白い空の画面が表示されます。その後、View Controllerのどこかをクリックすると、突然tableviewのデータが表示されます。ホーはこの問題を解決しますか?前もって感謝します!テーブルビューが再ロードされますが、表示されていない場合は、ViewControllerのどこでもクリックしてください。

コードIは

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

:そう、あなたは次のようにしなければなりません。

まずactivityIndi​​catorインスタンスを追加し、これらの2方法のあなたの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() 
} 

に今すぐあなたの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個のスレッド:Apple documentation

から

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

ロード要求が完了したときに呼び出される終了ハンドラ。このハンドラはデリゲートキューで実行されます。

+0

メインキューブロックにself.tableView.reloadData()を入れるだけで十分です。 –

1

UIスレッドで更新を行う必要があります。そのためには、main queueにcallを置く必要があります。これは、dispatch_async()を使用して取得できます。あなたはそれが要求を処理しても、メインスレッドでtableViewをリロードしていることを示すために、あなたのビューでの活動の指標を追加する必要が

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

それは動作します!ありがとうMr.Mayank Baiswar!この答えで私の質問から小さな変化 'self.tableView.reloadData()':D –

+0

ああ申し訳ありません!私はあなたがtableViewで作ったIBOutletを意味していました。 –

+0

mmm thats大丈夫:D私はそれを持って:) thankz –

関連する問題