Populating UITableView from JSON



我正在尝试使用json文件在我的应用中填充一个uibleview。以前,我正在硬编码一系列示例数据,但需要移动使用我的JSON文件。这是关于So中找到的各种教程和答案的混音,因此,如果语法会议有些偏离,我深表歉意。

import UIKit
import os.log
class BonusTableViewController: UITableViewController {
    //MARK: Properties
    var bonuses = [Bonus]() // Used for old sample data
    var jBonuses = [Bonuses]() // Used with JSON based data
    override func viewDidLoad() {
        super.viewDidLoad()
    //MARK: Confirm JSON file was loaded and log the Bonus Codes
        let loadedBonuses = loadJson(filename: "BonusData")
        for bonus in loadedBonuses! {
            print(bonus.bonusCode)
        }
    }
    // Load the JSON file from the bundled file.
    func loadJson(filename fileName: String) -> [Bonuses]? {
        if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let jsonData = try decoder.decode(JSONData.self, from: data)
                print("loadJson loaded JSON")
                return jsonData.bonuses
            } catch {
                print("error:(error)")
            }
        }
        return nil
    }
    // MARK: Data Structures
    // Bonus Data Structs
    struct JSONData: Decodable {
        let name: String
        let version: String
        let bonuses: [Bonuses]
    }
    struct Bonuses: Decodable {
        let bonusCode: String
        let category: String
        let name: String
        let value: Int
        let city: String
        let state: String
        let flavor: String
        let imageData: String
    }
    // MARK: - Table view data source
    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return jBonuses.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Table view cells are reused and should be dequeued using a cell identifier.
        let cellIdentifier = "BonusTableViewCell"
        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? BonusTableViewCell else {
            fatalError("The dequeued cell is not an instance of BonusTableViewCell.")
        }
    // Now using JSON file
        let jBonus = jBonuses[indexPath.row]
        print("Setting labels using JSON file")
        cell.bonusCodeLabel.text = jBonus.bonusCode
        cell.categoryLabel.text = jBonus.category
        cell.nameLabel.text = jBonus.name
        cell.valueLabel.text = "(jBonus.value)"
        cell.cityLabel.text = "(jBonus.city),"
        cell.stateLabel.text = jBonus.state
        cell.flavorText.text = jBonus.flavor
        cell.primaryImage.image = jBonus.photo
        return cell
    }

从控制台中,我可以确认它能够看到JSON数据,并且确实吐出了奖励代码列表。我无法确定为什么这不起作用,但是结果只是空白的桌面视图,上面有一堆空行。

替换 viewDidLoad
override func viewDidLoad() {
    super.viewDidLoad()
    jBonuses = loadJson(filename: "BonusData")!
    tableView.reloadData()
}

您必须将加载的数据分配给数据源数组并重新加载表视图。

loadedBonuses确实可以是nil(在这种情况下不能(:

override func viewDidLoad() {
    super.viewDidLoad()
    if let loadedBonuses = loadJson(filename: "BonusData") {
        jBonuses = loadedBonuses
        tableView.reloadData()
    }
}

注意:

  • 删除方法numberOfSections1是默认值。
  • 强制解开单元格,如果一切都正确连接,则代码不得崩溃

    let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! BonusTableViewCell
    

您使用类型奖金的Jbonuses数组来填充表观视图,但是您在填充Jbonuses数组的位置。

看来您没有填充Jbonuses数组。填充Jbonuses数组后,一旦您获得API响应并调用TableView ReloAddata方法。

yourTableView.reloadData()

最新更新