数据未在 UITableViewCell Swift 上显示

Posted

技术标签:

【中文标题】数据未在 UITableViewCell Swift 上显示【英文标题】:Data is not displaying on UITableViewCell Swift 【发布时间】:2016-07-28 17:24:25 【问题描述】:

我可以在函数 getJSON() 中打印符号,但是在显示 StockArray 时,什么都没有出现,而当我打印 StockArray 时,也什么都不出现。我不知道问题所在。这是代码。

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
    




谢谢。

【问题讨论】:

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

您是否尝试在循环后在 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】:

您需要在主线程中重新加载 UITableView,就在 stock 数组中存在所有数据之后。我不是快速的家伙,但在objective-c中对应的代码如下。

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

NSOperationQueue

UITableView reloaddata

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

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

我也必须插入

tableView.dataSource = self
tableView.delegate = self

进入 viewDidLoad()

再次感谢您!

【讨论】:

以上是关于数据未在 UITableViewCell Swift 上显示的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 未在其中显示 UILabel

UITextView 高度未在 UITableViewCell 中调整大小

UITableViewCell 附件视图按钮未在 ipad 纵向模式下显示

UIImageView 未在自定义 UITableViewCell 中显示图像

右侧细节 UITableViewCell 未在 iPad 上显示整行

UITableviewCell 高度未在滚动时重置