JSON提要赢得';不能在Tableview中显示
在tableview中显示数据时遇到问题。我知道我正在获取数据,因为我已经设置了打印功能,显示数据是另一回事。作为参考,这是一个来自和API的JSON提要,在这里列出。如果有人有任何建议,我将不胜感激。谢谢JSON提要赢得';不能在Tableview中显示,json,swift,api,uitableview,Json,Swift,Api,Uitableview,在tableview中显示数据时遇到问题。我知道我正在获取数据,因为我已经设置了打印功能,显示数据是另一回事。作为参考,这是一个来自和API的JSON提要,在这里列出。如果有人有任何建议,我将不胜感激。谢谢 import UIKit struct PlayerStatsParent:Decodable{ let rankings: [PlayerStats] } //Optional objects are defined using ? struct PlayerStats:Dec
import UIKit
struct PlayerStatsParent:Decodable{
let rankings: [PlayerStats]
}
//Optional objects are defined using ?
struct PlayerStats:Decodable {
let personaname: String?
let score: Double?
let solo_competitive_rank: Int?
let avatar: String?
}
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var rankTable: UITableView!
var rank = [PlayerStats]()
override func viewDidLoad() {
super.viewDidLoad()
//this is an optional URL, so need to define objects in contains
let jsonUrlString = "https://api.opendota.com/api/rankings"
guard let url = URL(string: jsonUrlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else {return}
//let dataAsString = String(data: data, encoding: .utf8)
//print(dataAsString)
do{
let downloadedRank = try JSONDecoder().decode(PlayerStatsParent.self, from: data)
self.rank = downloadedRank.rankings
DispatchQueue.main.async {
self.rankTable.reloadData()
}
print(downloadedRank.rankings)
} catch let jsonErr {
print("Error jsonErr", jsonErr)
}
}.resume()
}
let jsonUrlString = "https://api.opendota.com/api/rankings"
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return rank.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "rankCell") as? RankTableViewCell else { return UITableViewCell() }
cell.nameLabel.text = rank[indexPath.row].personaname
return cell
}
除非您已经在故事板中设置了UITableView委托和数据源,否则您需要在
viewDidLoad
中进行设置,如下所示:
self.rankTable.delegate = self
self.rankTable.dataSource = self
否则,您的tableview无法获取数据。如果它在情节提要中全部连接,则无需执行此操作。这解决了我的问题,但我相信rmaddy也是正确的。是的,我已编辑注释以包含这两个选项。是否检查了返回的行数rank.count?代码看起来正确。强制展开单元格以检测设计错误:
let cell=tableView.dequeueReusableCell(带有标识符:“rankCell”,for:indexPath)as!RankTableViewCell
@vadian同意。通过guard
显示空白单元格是查找开发错误的较慢方法。