【问题标题】:JSON Feed Won't Display in TableviewJSON 提要不会显示在 Tableview 中
【发布时间】:2017-12-06 20:45:42
【问题描述】:

我在表格视图中显示数据时遇到问题。我知道我正在获取数据,因为我设置了打印功能,显示数据是另一回事。作为参考,这是来自 API 的 JSON 提要,在此处列出 https://api.opendota.com/api/rankings。如果有人有任何建议,我将不胜感激。谢谢。

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
    }

【问题讨论】:

  • 你检查了多少行 rank.count 返回?
  • 代码看起来正确。强制打开单元格以检测设计错误:let cell = tableView.dequeueReusableCell(withIdentifier: "rankCell", for: indexPath) as! RankTableViewCell
  • @vadian 同意。通过guard 显示空白单元格是查找开发错误的较慢方法。

标签: json swift api uitableview


【解决方案1】:

除非您在情节提要中设置了 UITableView 委托和数据源,否则您需要在 viewDidLoad 中进行设置,如下所示:

self.rankTable.delegate = self
self.rankTable.dataSource = self

否则你的tableview无法获取数据。

【讨论】:

  • 如果在storyboard中全部连接就不需要了。
  • 这解决了我的问题,但我相信 rmaddy 也是正确的。
  • 是的,我已编辑我的评论以包含这两个选项。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多