gpt4 book ai didi

json - UITableView 的部分作为来自 Json 数据的日期

转载 作者:行者123 更新时间:2023-11-28 05:56:27 24 4
gpt4 key购买 nike

我正在处理 TableView 以呈现 JSON 解析后收到的一些数据。我希望我的 TableView 具有基于不同日期的部分。 JSON 中的每条记录都是一个事件,多个事件可以在一个日期发生。

这是我的 JSON 数据 https://get.rosterbuster.com/wp-content/uploads/dummy-response.json

我想像这样渲染我的表格 View Table View with Sections as Date

到目前为止我做了什么:

我已经按照以下结构解析了数据

struct Roster : Codable {

let flightnr: String?
let date: String?
let aircraftType: String?
let tail: String?
let departure: String?
let destination: String?
let departTime: String?
let arrivalTime: String?
let dutyID: String?
let dutyCode: String?
let captain: String?
let firstOfficer: String?
let flightAttendant: String?

enum CodingKeys: String, CodingKey {
case flightnr = "Flightnr"
case date = "Date"
case aircraftType = "Aircraft Type"
case tail = "Tail"
case departure = "Departure"
case destination = "Destination"
case departTime = "Time_Depart"
case arrivalTime = "Time_Arrive"
case dutyID = "DutyID"
case dutyCode = "DutyCode"
case captain = "Captain"
case firstOfficer = "First Officer"
case flightAttendant = "Flight Attendant"
}
}

我还设置了基本的表格 View ,但不知道如何根据我在上面附加的图像将检索到的数据分组到不同的部分。

如有任何帮助,我们将不胜感激。

最佳答案

这是我建议的方法:

1) 通过在基于日期属性的集合中映射 API JSON 响应获取节数。这是您可以使用的东西(也许您也不需要将其转换为 Array 并且您想检查日期是否不为 nil)

self.sections = Array(Set(self.dataModel.map({ (roster) -> String in
roster.date!
})))

2) 通过为每个部分创建一个 Roster 数组来设置您的 rowsPerSection 数据模型。

//first set the array of sections.count dimension and empty array for each item
self.sections.forEach({ (string) in
self.rowsPerSection.append([])
})
//then set each array
for index in 0..<self.sections.count {
self.dataModel.forEach({ (roster) in
if roster.date == self.sections[index] {
self.rowsPerSection[index].append(roster)
}
})
}

这是我的虚拟代码,我用你的 URL 测试了它并且它有效:

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!

var dataModel = [Roster]()
var sections = [String]()
var rowsPerSection = [[Roster]]()

override func viewDidLoad() {
super.viewDidLoad()

tableView.delegate = self
tableView.dataSource = self

APICall { (rosters) in
DispatchQueue.main.async {
self.dataModel = rosters!
self.sections = Array(Set(self.dataModel.map({ (roster) -> String in
roster.date!
})))

//first set the array of sections.count dimension and empty array for each item
self.sections.forEach({ (string) in
self.rowsPerSection.append([])
})
//then set each array
for index in 0..<self.sections.count {
self.dataModel.forEach({ (roster) in
if roster.date == self.sections[index] {
self.rowsPerSection[index].append(roster)
}
})
}
self.tableView.reloadData()
}
}
}

func APICall(onSuccess: @escaping(_ response: [Roster]?) -> Void) {
let group = DispatchGroup()
group.enter()

DispatchQueue.global(qos: .default).async {
let url = URL(string: "https://get.rosterbuster.com/wp-content/uploads/dummy-response.json")!
let requestURL = URLRequest(url: url)
let session = URLSession.shared
session.dataTask(with: requestURL) { (data, response, error) in
let decoder = JSONDecoder()
let responseJson = try! decoder.decode([Roster].self, from: data!)
onSuccess(responseJson)
group.leave()
}.resume()
group.wait()
return
}
}
}

extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int {
return sections.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
for index in 0..<sections.count {
if index == section {
return rowsPerSection[index].count
}
}
return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = rowsPerSection[indexPath.section] [indexPath.row].destination

return cell
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sections[section]
}
}

这是屏幕截图 -> screenshot

关于json - UITableView 的部分作为来自 Json 数据的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51343301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com