表视图没有填充数据,但我的print语句正在运行

时间:2018-06-07 06:35:44

标签: swift4 xcode9

当我运行以下代码时,我在控制台日志中获得了正确的JSON版本和奖励代码列表,但是表格视图本身没有显示任何数据。

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!

var bonuses = [JsonFile.JsonBonuses]()

override func viewDidLoad() {
    super.viewDidLoad()

    downloadJSON {
        self.tableView.reloadData()
    }

    tableView.delegate = self
    tableView.dataSource = self
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    print("Found \(bonuses.count) rows in section.")
    return bonuses.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
    cell.textLabel?.text = bonuses[indexPath.row].name.capitalized
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    performSegue(withIdentifier: "showDetails", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let destination = segue.destination as? HeroViewController {
        destination.bonus = bonuses[(tableView.indexPathForSelectedRow?.row)!]
    }
}

// MARK: - Download JSON from ToH webserver
func downloadJSON(completed: @escaping () -> ()) {
    let url = URL(string: "http://tourofhonor.com/BonusData.json")
    URLSession.shared.dataTask(with: url!) { [weak self] (data, response, error) in
        if error == nil {
            do {
                let posts = try JSONDecoder().decode(JsonFile.self, from: data!)
                DispatchQueue.main.async {
                    completed()
                }
                print("JSON Version \(posts.meta.version) loaded.")
                print(posts.bonuses.map {$0.bonusCode})
                self?.bonuses = posts.bonuses
            } catch {
                print("JSON Download Failed")
            }
        }
    }.resume()
}
}

该代码基于我在网上找到的教程,该教程最初使用DOTA字符信息来填充数据。我将其更改为使用我自己的JSON提要,这似乎是有效的,因为我可以在控制台中看到红利代码,但是没有在应用程序中显示任何数据。

2 个答案:

答案 0 :(得分:0)

问题是您在填充self.bonuses数组之前调用完成闭包,尝试将其放在该行之后。

我还建议这些行:

tableView.delegate = self
tableView.dataSource = self

在调用downloadJSON方法之前。

答案 1 :(得分:0)

API正在异步工作,因此在API调用完成之前加载了表。因此,您必须在API获取结果后重新加载表。

            print(posts.bonuses.map {$0.bonusCode})
            self?.bonuses = posts.bonuses

            DispatchQueue.main.async {
                //reload table in the main queue
                self.myTableView.reloadData()
            }
        }