如果 json 的数据中没有节,如何在 TableView 中设置节标题?

How to do section title in TableView if there is no sections in data from json?

正如标题所说,我想根据从 json 获得的一些 属性 对我的数据进行分类。 这是我的示例 json:

{
"rows": [
    {
        "id": 1,
        "name": "Trip to London",
        "status": "CURRENT",
        "companyId": 395,
        "approvedBy": null,
        "start": "2021-01-12T00:00:00.000Z",
        "end": "2021-01-13T00:00:00.000Z",
        "approvedAt": null,
        "updatedBy": null,
        "createdAt": "2021-01-04T13:32:45.816Z",
        "updatedAt": "2021-01-04T13:32:45.816Z",
        "services": "Flight"
    }
  ]
}

我的响应有 3 种状态,即状态:json 响应中的字符串,可能的值是:即将到来、当前和之前。我想按状态 属性 对我的数据进行分类,如果我得到该行程是当前的,则将其放在当前的部分标题下。

到目前为止我试过的是:

numberOfRowsInSection:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if isSearching {
        return self.filteredData.count
    }
    return bookedTrips.count
}

viewForHeaderInSection:

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: Cells.sectionTitle) as! TripsListHeaderCell
    if section == 0 {
        cell.configure(trips: "CURRENT")
    } else if section == 1 {
        cell.configure(trips: "UPCOMING")
    } else {
        cell.configure(trips: "PREVIOUS")
    }
    return cell
}

编辑:cellForRowAt:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: Cells.tripInfo) as! TripsListDetailCell
    if isSearching {
        cell.configure(trips: filteredData[indexPath.row])
    } else {
        cell.configure(trips: bookedTrips[indexPath.row])
    }
    return cell
}

如果我 return 函数 numberOfSections 中的数字 3,我会显示我的章节标题,但是因为我 returned 计数在 numberOfRowsInSection,一切都是重复的。由于我没有 2D 数组所以我可以使用部分,我应该怎么做才能按 json 的状态属性对我的数据进行分类?

当然,如果有更好的方法来编写 viewForHeaderInSection,我很确定有,请给我建议。

如果我的问题写得不正确并且很难理解我想说的内容,我可以 post 如果需要,我可以截图。

第 1 步:您需要为 Trip 创建结构,如下所示

struct TripStruct
{
    var sectionName : String
    var tripArray : [TripModel] = [] // Here TripModel == Your Trip Model
}

第 2 步:您需要将数据分组到部分

var tripStructList : [TripStruct] = [] //Here this Global Variable
var filterTripStructList : [TripStruct] = [] //Here this Global Variable

let groupedDictionary = Dictionary(grouping: allTripArray, by: { [=11=]. status }) // Here allTripArray == Your trip array from json
let keys = groupedDictionary.keys.sorted()
self.tripStructList = keys.map({ TripStruct(sectionName: [=11=], tripArray: groupedDictionary[[=11=]]!)})

第 3 步:在 tableView 委托和数据源方法中设置数据,如下所示

func numberOfSections(in tableView: UITableView) -> Int
{
    return isSearching ? self.filterTripStructList.count : self.tripStructList.count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    return isSearching ? self.filterTripStructList[section].tripArray.count : self.tripStructList[section].tripArray.count
}

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?
{
    let cell = tableView.dequeueReusableHeaderFooterView(withIdentifier: Cells.sectionTitle) as! TripsListHeaderCell
    
    let sectionRow = isSearching ? filterTripStructList[section] : tripStructList[section]

    cell.configure(trips: sectionRow.sectionName)
    
    return cell
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = tableView.dequeueReusableCell(withIdentifier: Cells.tripInfo) as! TripsListDetailCell
    
    let sectionRows = isSearching ? filterTripStructList[indexPath.section] : tripStructList[indexPath.section]
    let row = sectionRows.tripArray[indexPath.row]
    cell.configure(trips: row)
    
    return cell
}

第 4 步:搜索您的数据

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    
    if searchText == ""
    {
        isSearching = false
        filterTripStructList.removeAll()
        self.tableView.reloadData()
        return
    }
    else
    {
        isSearching = true
        
        let filterAllTripArray = self.allTripArray.filter({[=13=].tripName.lowercased().contains(searchText.lowercased())}) // Here allTripArray == Your trip array from json
        
        let groupedDictionary = Dictionary(grouping: filterAllTripArray, by: { [=13=].status })
        let keys = groupedDictionary.keys.sorted()
        self.filterTripStructList = keys.map({ TripStruct(sectionName: [=13=], tripArray: groupedDictionary[[=13=]]!)})
        
        self.tableView.reloadData()
    }
}