UITableViewCell 上未显示数据 Swift
Data is not displaying on UITableViewCell Swift
我可以在函数 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
}
}
谢谢。
您需要在主线程中重新加载 UITableView,就在库存数组中存在的所有数据之后。我不是 swift 人,但在 objective-c 中有相应的代码。
[[NSOperationqueue mainqueue]
^{
[tableview reloadData];
}];
你试过循环后在getJSON()中调用reload数据吗?
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()
}
简而言之: 在您的 getJSON
方法中,将所有数据附加到 StockArray
之后,您必须调用 tableView.reloadData()
.
更详细:
您正在进行异步(后台 -- 非阻塞)调用以获取您的 JSON。控制器将在该调用完成之前创建自己,因此当您的控制器首次打开时,没有数据可显示。异步加载完成后,您可以告诉您的控制器存在新数据并且应该显示它。
另一种方法是在 tableView 变量上设置 属性 观察者:
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.reloadData()
}
}
每次更改 tableView 的内容时,都会调用 reloadData 函数。
感谢您的所有回答,添加 tableView.relaodData()
是问题的一部分,
我还必须插入
tableView.dataSource = self
tableView.delegate = self
进入 viewDidLoad()
再次感谢您!
我可以在函数 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
}
}
谢谢。
您需要在主线程中重新加载 UITableView,就在库存数组中存在的所有数据之后。我不是 swift 人,但在 objective-c 中有相应的代码。
[[NSOperationqueue mainqueue]
^{
[tableview reloadData];
}];
你试过循环后在getJSON()中调用reload数据吗?
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()
}
简而言之: 在您的 getJSON
方法中,将所有数据附加到 StockArray
之后,您必须调用 tableView.reloadData()
.
更详细: 您正在进行异步(后台 -- 非阻塞)调用以获取您的 JSON。控制器将在该调用完成之前创建自己,因此当您的控制器首次打开时,没有数据可显示。异步加载完成后,您可以告诉您的控制器存在新数据并且应该显示它。
另一种方法是在 tableView 变量上设置 属性 观察者:
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.reloadData()
}
}
每次更改 tableView 的内容时,都会调用 reloadData 函数。
感谢您的所有回答,添加 tableView.relaodData()
是问题的一部分,
我还必须插入
tableView.dataSource = self
tableView.delegate = self
进入 viewDidLoad()
再次感谢您!