具有来自Json数据的节作为日期的UITableView

时间:2018-07-14 20:53:50

标签: json swift uitableview

我正在研究表视图以呈现JSON解析后接收到的一些数据。我希望表格视图具有基于不同日期的部分。 JSON中的每个记录都是一个事件,多个事件可以在单个日期发生。

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

我想这样渲染我的表格视图 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"
    }  
}

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是我建议的方法:

1)通过基于日期属性将API JSON响应映射到一组中,以获取部分数量。这是您可以使用的方法(也许您也不需要将其强制转换为Array,并且您想检查日期是否为nil)

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

2)通过为每个部分创建一个名册数组来设置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)
        }
    })
}

这是我的伪代码,我用您的网址对其进行了测试,并且可以正常工作:

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