UITableViewCell Swift上没有显示数据

时间:2016-07-28 17:24:26

标签: ios swift uitableview swifty-json

我可以在函数getJSON()中打印符号,但是到了显示StockArray的时候,Nothing就出现了,当我打印StockArray时,Nothing也出现了。我不知道这个问题。这是代码。

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
    }



}

谢谢。

5 个答案:

答案 0 :(得分:0)

您需要在主线程中重新加载UITableView,就在库存数组中存在的所有数据之后。我不是那个快速的人,但是在Objective-c中,相应的代码正在跟随。

SELECT ... (CASE WHEN 'foo'='bar' THEN 'baz' ELSE 'qux' ) AS foo
           ^--------------------------------------------^

NSOperationQueue

UITableView reloaddata

答案 1 :(得分: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() 
            }

答案 2 :(得分:0)

简而言之:在getJSON方法中,在将所有数据附加到StockArray后,您必须致电tableView.reloadData()

更详细: 您正在进行异步(后台 - 非阻塞)调用以获取JSON。控制器将在调用完成之前自行创建,因此当您的控制器首次打开时,无法显示任何数据。异步加载完成后,您可以告诉控制器存在新数据并且应该显示它。

答案 3 :(得分:0)

另一种方法是在tableView变量上设置属性观察器:

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

每次更改tableView的内容时,都会调用reloadData func。

答案 4 :(得分:0)

感谢您提供所有答案,而添加tableView.relaodData()是问题的一部分,

我还必须插入

tableView.dataSource = self
tableView.delegate = self

进入viewDidLoad()

再次感谢你!