2016-07-28 64 views
0

我可以在函数getJSON()中打印符号,但是当它显示StockArray时,Nothing显示,并且当我打印StockArray时,Nothing也会出现。我不知道这个问题。这是代码。数据不显示在UITableViewCell上Swift

import UIKit 
import Alamofire 
import ObjectMapper 
import SwiftyJSON 

class HomeViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

    var NumberofRows = 0 
     let stockURL = "https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL+TSLA%22)&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&format=json" 
    var StockArray = [String]() 




    @IBOutlet weak var tableView: UITableView! 

// @IBOutlet weak var StockSymbolLbl: UILabel! 
// @IBOutlet weak var BidSymbolLbl: UILabel! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     getJSON() 
//  StockSymbolLbl.text = "" 
//  BidSymbolLbl.text = "" 


     } 

    func getJSON(){ 
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
     let url = NSURL(string: self.stockURL) 
     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 Symbol: String? = swiftyJSON["query"]["results"]["quote"][0]["symbol"].stringValue 
       let bid: String? = swiftyJSON["query"]["results"]["quote"][0]["Change"].stringValue 
       print(Symbol!) 
       print(bid!) 
       dispatch_async(dispatch_get_main_queue()) { 
//    self.StockSymbolLbl.text? = "\(Symbol!)" 
//    self.BidSymbolLbl.text? = "\(bid!)" 
        self.NumberofRows = swiftyJSON["query"]["results"]["quote"].count 

        for i in 0...self.NumberofRows { 
         var stockcount = 0 
         stockcount += i 
         let Stock = swiftyJSON["query"]["results"]["quote"][stockcount]["symbol"].stringValue 
         self.StockArray.append(Stock) 
         print(Stock) 
        } 

       } 



      }else{ 
       print("There was an error") 
      } 

     } 
     task.resume() 
    } 

} 
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return NumberofRows 
    } 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

     if StockArray.count != 0{ 
      cell.textLabel?.text = StockArray[indexPath.item] 
     } 

     print(self.StockArray) 

     return cell 
    } 



} 

谢谢。

+0

注意:'cellForRowAtIndexPath'中的'StockArray.count!= 0'检查是多余的,因为如果数组为空,通常不会调用该方法。而是在'numberOfRowsInSection'中返回'StockArray.count',而不是准硬编码的'NumberofRows' – vadian

回答

0

您是否尝试过在循环后调用的getJSON()的重载数据?

   for i in 0...self.NumberofRows { 
        var stockcount = 0 
        stockcount += i 
        let Stock = swiftyJSON["query"]["results"]["quote"][stockcount]["symbol"].stringValue 
        self.StockArray.append(Stock) 
        print(Stock) 
       } 
       tableView.reloadData() 
      } 
0

您需要重新加载主线程中的UITableView,紧跟在存储阵列中的所有数据之后。我不是快速的人,但在Objective-C中,相应的代码如下。

[[NSOperationqueue mainqueue] 
    ^{ 
     [tableview reloadData]; 
    }];  

NSOperationQueue

UITableView reloaddata

0

简而言之:在你getJSON方法,所有的数据附加到StockArray后,你必须调用tableView.reloadData()

更多详细信息: 您正在进行异步(后台 - 非阻塞)调用来获取您的JSON。在呼叫完成之前,控制器将自行创建,因此,当您的控制器第一次打开时,不会显示任何数据。一旦异步加载完成,您可以告诉您的控制器存在新数据并显示它。

0

这样做的另一种方式是设置在可变的tableView属性观察员:

@IBOutlet weak var tableView: UITableView! { 
     didSet { 
      tableView.reloadData() 
     } 
} 

每当您的tableView的内容发生了变化reloadData func被调用。

0

感谢您对所有的答案,同时加入tableView.relaodData()是问题的一部分,

我也不得不插入

tableView.dataSource = self 
tableView.delegate = self 

到viewDidLoad中()

再次感谢您!