Swift: Complex JSON Данные модели не отображаются должным образом в UITableView - PullRequest
0 голосов
/ 11 февраля 2020

У меня есть комплекс JSON (вложенные значения), я правильно реализовал и значения данных в модели. Но по некоторым неизвестным причинам он не печатает полные данные, показывая только сначала 12 values и на самом деле он имеет 71 data values. Я знаю, что что-то не так настраиваю indexPath из-за сложных данных. Моя модель и json являются сложными (вложенными) и итерациями одной.

  1. Мне нужно показать данные tableView, которые имеют только c, например, тип действия actionType": 101 и title как раздел в списке выбора (проверка json) и значения textField в tableView список.
  2. Так, как я могу правильно установить AppData?.items?[indexPath.row] это для секции и для строки.

Примечание. Мне нужен только один тип действия из JSON, который равен 101, а Title - разделом tableView, а textField - значениями списка, и оба они в pickList. Я прикрепил образец маленький JSON.

Код:


var AppData: SectionList?

let decoder = JSONDecoder()
let response = try decoder.decode(SectionList.self, from: pickResult)
self.AppData = response

TableView:

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

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

        return cell 
    }

Модель:

struct SectionList : Codable {

let title : String?
var items : [Item]?
var modified: Bool? = false
}


struct Item : Codable {

    let actionType : Int?
    let actionUrl : String?
    let bgColor : String?
    let booleanValue : Bool?
    var textField : String?
    var textValue : String?
    let unitId : Int? 
    let latitude : Double?
    let longitude : Double?
    let actionParamData: String?
    let actionTitle: String?
    let pickList: [SectionList]?
    var selection: [Item]?
    let multiSelect: Bool?
    let selectedValue: [String]?
    let version: Int?
    let masterId: Int?
    let actionId: Int?
    let itemValue: String?
    var required: Bool? = false
}

Образец JSON:

{
  "items": [
    {
      "actionType": 101,
      "version": 3,
      "pickList": [
        {
          "title": "Sayaç yeri seçimi",
          "items": [
            {
              "textField": "Sayaç Yeri Seçiniz",
              "itemValue": "0"
            },
            {
              "textField": "Sayaç daire girişinde",
              "itemValue": "1"
            },
            {
              "textField": "Sayaç apt. girişinde",
              "itemValue": "2"
            },
            {
              "textField": "Sayaç bodrumda",
              "itemValue": "3"
            },
            {
              "textField": "Sayaç çatı katında",
              "itemValue": "4"
            },
            {
              "textField": "Sayaç bahçede (Müstakil)",
              "itemValue": "5"
            },
            {
              "textField": "Sayaç bina dışında",
              "itemValue": "6"
            },
            {
              "textField": "Sayaç balkonda",
              "itemValue": "7"
            },
            {
              "textField": "Sayaç daire içinde",
              "itemValue": "8"
            },
            {
              "textField": "Sayaç istasyon içinde",
              "itemValue": "9"
            }
          ]
        }
      ]
    },
    {
      "actionType": 1015,
      "version": 3,
      "pickList": [
        {
          "title": "AĞAÇ KURUTMA ÜNİTESİ",
          "items": [

          ]
        }
      ]
    },
    {
      "actionType": 1016,
      "version": 3,
      "pickList": [
        {
          "title": "ASTAR FIRINI",
          "items": [

          ]
        }
      ]
    }
]
}

Обновлен код

var AppData: [Inner]?

let decoder = JSONDecoder()
let response = try decoder.decode(Root.self, from: pickResult)
let res = response.items.filter { $0.actionType == 103 }
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[section].title
}

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

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

    let data = dic?[indexPath.row].textField
    cell.textLabel?.text = data

    return cell 
}

1 Ответ

0 голосов
/ 11 февраля 2020

Вам нужно

struct Root: Codable {
    let items: [Inner]
}

struct Inner: Codable {
    let actionType, version: Int
    let pickList: [PickList]
}

struct PickList: Codable {
    let title: String
    let items: [PickListItem]
}
struct PickListItem: Codable {
    let textField, itemValue: String
}

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