Табличное представление не заполняет данные, но мои операторы печати работают - PullRequest
0 голосов
/ 07 июня 2018

Когда я запускаю приведенный ниже код, я получаю правильную версию 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 голосов
/ 08 июня 2018

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()
            }
        } 
0 голосов
/ 07 июня 2018

Проблема в том, что вы вызываете завершение завершения перед заполнением массива self.bonuses, попробуйте поставить его после этой строки.

Я также рекомендую поставить следующие строки:

tableView.delegate = self
tableView.dataSource = self

Перед вызовом метода downloadJSON.

...