Я пытаюсь реализовать разделы и строки в UITableView, но из-за вложенной структуры модели JSON я не успешен. Всегда печатать только first section title. Я использую Codable подход, и структура модели не может быть изменена.

Как добиться разделов и строк в tableView? любое руководство или помощь были бы очень признательны. Я действительно борюсь за это.

  • Мне нужно отобразить в TableView Section title и Rows textField - см. JSON.
  • прикреплен скриншот с печатью только одного section title

Модель:

struct SectionList : Codable {

    let title : String?
    var items : [Item]?

}

struct Item : Codable {

    let actionType : Int?
    var textField : String?
    let pickList: [SectionList]?
    let itemValue: String?
    let version: Int?

}

Код инициализации и TableView:

var AppData: [Item]?

let decoder = JSONDecoder()
let response = try decoder.decode(SectionList.self, from: pickResult)
let res = response.items?.filter { $0.actionType == 101}
self.AppData = res


func numberOfSections(in tableView: UITableView) -> Int {
        return AppData?.count ?? 0
    }

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
   return AppData?[section].pickList[0].title
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return AppData?[section].pickList?.count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    let dic = AppData?[indexPath.section]//.pickList?[indexPath.row].title
        //AppData?[indexPath.section].pickList[indexPath.row].items
    //print(dic)

    return cell 
}
1
Newbie 12 Фев 2020 в 12:04

2 ответа

Лучший ответ

Что бы я ни понимал под тобой, я делаю это. Проверьте этот код

Создать структуру как

struct SectionList : Codable {

    let title : String?
    var items : [RowItems]?

}

struct RowItems: Codable {
    var textField : String?
    let itemValue: String?
}

struct SourceData: Codable {
    let items: [Item]?
}
struct Item : Codable {
    let actionType : Int?
    let pickList: [SectionList]?
    let version: Int?

}

Создать переменную как

var AppData: Item?

Разобрать json как

let decoder = JSONDecoder()
            let response = try decoder.decode(SourceData.self, from: data)
            let res = response.items?.filter { $0.actionType == 101}
            print("jsonData:\(res)")
            AppData = res?.first

Вызовите источник данных таблицы как

func numberOfSections(in tableView: UITableView) -> Int {
    return AppData?.pickList?.count ?? 0
    }

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return AppData?.pickList?[section].items?.count ?? 0
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = UITableViewCell()
    let dic = AppData?.pickList?[indexPath.section].items?[indexPath.row]//.pickList?[indexPath.row].title
        //AppData?[indexPath.section].pickList[indexPath.row].items
    //print(dic)

    cell.textLabel?.text = dic?.textField
    return cell
}

Снимок экрана с этим кодом Таблица после этих изменений

2
sDev 12 Фев 2020 в 09:46

Ваша модель должна быть похожа

import Foundation

    // MARK: - Items
    struct Items: Codable {
        let items: [ItemsItem]?
    }

    // MARK: - ItemsItem
    struct ItemsItem: Codable {
        let actionType, version: Int?
        let pickList: [PickList]?
    }

    // MARK: - PickList
    struct PickList: Codable {
        let title: String?
        let items: [PickListItem]?
    }

    // MARK: - PickListItem
    struct PickListItem: Codable {
        let textField, itemValue: String?
    }

Ваша переменная должна быть такой

var appData : Items?

Во время декодирования просто добавьте это

appData = try decoder.decode(Items.self, from: pickResult)

Ваш делегат табличного представления и источник данных должны быть как

  func numberOfSections(in tableView: UITableView) -> Int {
                return appData?.items?.first?.pickList?.count ?? 1
            }
            func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
                let cell = UITableViewCell()
                return appData?.items?.first?.pickList?.first?.title
            }
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return appData?.items?.first?.pickList?[section].items?.count ?? 1
            }

            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                let cell = UITableViewCell()
                cell.textLabel?.text = appData?.items?.first?.pickList?.first?.items?[indexPath.row].textField
                return cell
            }
0
Kamrul Hassan Sabuj 12 Фев 2020 в 09:57