我正在尝试使用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()
}
}
注意:
- 删除方法
numberOfSections
,1
是默认值。 强制解开单元格,如果一切都正确连接,则代码不得崩溃
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! BonusTableViewCell
您使用类型奖金的Jbonuses数组来填充表观视图,但是您在填充Jbonuses数组的位置。
看来您没有填充Jbonuses数组。填充Jbonuses数组后,一旦您获得API响应并调用TableView ReloAddata方法。
yourTableView.reloadData()