Как распечатать комплекс Json в CollectionView с помощью Swift Codable? - PullRequest
0 голосов
/ 09 января 2020

Я изучаю Swift 5. Я использую Codable для JSON разбора.

Я бы хотел напечатать спецификации c данных из JSON в CollectionView .

В настоящее время анализ данных прошел успешно, но я не уверен, как вывести его в CollectionView.

Я хочу напечатать все JSON данных TR_DT в ячейки CollectionView.

Я печатал данные до yyyyMm. Я не знаю вывод более глубокого TR_DT.

что мне делать?

, пожалуйста, помогите новичкам. :)

(Исходный код прилагается ниже.)

{

"list": [
    {
        "summary": [
            {
                "IN_AMT": 0,
                "OK_AMT": 0,
                "TR_MONTH": "201906"
            },
            {
                "IN_AMT": 0,
                "OK_AMT": 24256210,
                "TR_MONTH": "201907"
            }
        ],
        "yyyyMm": "201907",
        "list": [
            {
                "TR_DT": "20190623"
            },
            {
                "TR_DT": "20190624"
            },
            {
                "TR_DT": "20190625"
            },
            {
                "TR_DT": "20190626"
            },
            {
                "TR_DT": "20190627"
            },
            {
                "TR_DT": "20190628"
            },
            {
                "TR_DT": "20190629"
            }
                ]
    }
        ]
}

Этот источник - Jsondata.

import Foundation

// MARK: - Calendar
struct Calendar: Codable {
    let list: [CalendarList]
}

// MARK: - CalendarList
struct CalendarList: Codable {
    let summary: [Summary]
    let yyyyMm: String
    let list: [ListList]
}

// MARK: - ListList
struct ListList: Codable {
    let trDt: String

    enum CodingKeys: String, CodingKey {
        case trDt = "TR_DT"
    }
}

// MARK: - Summary
struct Summary: Codable {
    let inAmt, okAmt: Int
    let trMonth: String

    enum CodingKeys: String, CodingKey {
        case inAmt = "IN_AMT"
        case okAmt = "OK_AMT"
        case trMonth = "TR_MONTH"
    }
}

Этот источник является моделью

import UIKit

class ViewController: UIViewController {

    var arrData = [List]()
    var sumData = [Summary]()
    let urlJSON = url

    @IBOutlet var calendarCollectionView: UICollectionView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.


        guard let url = URL(string: urlJSON) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else {return}
            guard error == nil else {return}
            do {
                let decoder = JSONDecoder()
                let APIResponse = try decoder.decode(CalendarModel.self, from: data)

                self.arrData = APIResponse.list!

                DispatchQueue.main.async{
                    self.calendarCollectionView.reloadData()
                }

            } catch let error {
                print("Failed to decode JSON:", error)
            }
        }.resume()
    }


}


extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        return arrData.count
    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CalendarCell.identifier, for: indexPath) as! CalendarCell

        let data = arrData[indexPath.row]


        return cell
    }

}

Этот источник является ViewController.

1 Ответ

0 голосов
/ 09 января 2020

Прежде всего, arrData должен иметь тип [ListList], т. Е.

var arrData = [ListList]()

Вам необходимо проанализировать данные как,

do {
    let response = try JSONDecoder().decode(Calendar.self, from: data)
    arrData = response.list.first?.list ?? []
    DispatchQueue.main.async {[weak self] in
        self?.calendarCollectionView.reloadData()
    }
} catch {
    print(error)
}

Теперь используйте arrData в collectionView(_: cellForItemAt:) вроде так,

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: CalendarCell.identifier, for: indexPath) as! CalendarCell
    let data = arrData[indexPath.row].trDt
    //use data as text to set in the label
    return cell
}
...