Как я могу обновить пользовательский интерфейс, используя данные JSON, которые я получаю с сервера? - PullRequest
0 голосов
/ 12 мая 2019

Я использую Swift Codable Protocol и получаю данные JSON, которые мне нужно поместить в свои метки и изображения, но они не отображаются в моем табличном представлении при запуске приложения.

Вот как выглядит мой кодкак

import UIKit

struct OfferList: Codable {
    let data: [Int: CarItems]?
    let status: String?
    let count: Int? }

struct CarItems: Codable {

    let id: String?
    let image: URL?
    let manufacturer: String?
    let model: String?
    let price_net: Int?
    let price_old: Int?
    let price_gross: Int?
    let power_kw: String?
    let power_ps: String?
    let milage: String?
    let fueltype: String? }

class OfferVC: UIViewController {

    @IBOutlet weak var tableView: UITableView!

    var viewModels = [CarItems]() {
        didSet {
            self.tableView.reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        let urlString = "http://grandex.de/api/v1/de/offers"
        guard let url = URL(string: urlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else { return }
            guard err == nil else { return }

            do {
                let array: Any = try JSONSerialization.jsonObject(with: data, options: [.allowFragments])
                print(array)
                if let objects = try JSONDecoder().decode(OfferList.self, from: data).data {
                    objects.forEach({
                        print($0)
                        self.viewModels.append($1)

                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    })
                }
            } catch let jsonErr {
                print(jsonErr)
            }
        }.resume()
    } }

extension OfferVC: UITableViewDelegate, UITableViewDataSource {

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "id") as! Cell
        let vm = viewModels[indexPath.row]
        cell.update(with: vm)
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 130
    } }

class Cell: UITableViewCell {

    @IBOutlet weak var carImage: UIImageView?
    @IBOutlet weak var title: UILabel?
    @IBOutlet weak var fuelType: UILabel?

    func update(with item: CarItems) {
        title?.text = item.manufacturer
        fuelType?.text = item.fueltype
    } }

Я ожидаю, что это изменит мои метки, но в симуляторе табличное представление пусто.Пожалуйста, посоветуйте, что я делаю не так.Также может кто-нибудь сказать мне, как я могу обновить изображение с данными JSON?Любая помощь приветствуется!Заранее спасибо !!

Ответы [ 3 ]

0 голосов
/ 12 мая 2019

В структурах есть две основные ошибки: data равно [CarItems] и priceNet равно Double.

Вы должны получить ошибку

Несоответствие типа словаря: ожидается декодирование словаря, но вместо него найден массив.

Объявить все элементы структуры необязательными и назвать их camelCased

struct OfferList: Decodable {
    let data: [CarItems]
    let status: String
    let count: Int
}

struct CarItems: Decodable {

    let id: String
    let image: URL
    let manufacturer: String
    let model: String
    let priceNet: Double
    let priceOld: Int
    let priceGross: Int
    let powerKw: String
    let powerPs: String
    let milage: String
    let fueltype: String
}

Объявление массива источника данных без наблюдателя свойства

var viewModels = [CarItems]()

Расшифруйте JSON

URLSession.shared.dataTask(with: url) { (data, _, error) in
      if let error = error { print(error); return }     

      do {   
         let decoder = JSONDecoder()
         decoder.keyDecodingStrategy = .convertFromSnakeCase
         let result = try decoder.decode(OfferList.self, from: data!)
         self.viewModels = result.data
         DispatchQueue.main.async {
             self.tableView.reloadData()
         }          
      } catch {
          print(error)
      }
}.resume()

Убедитесь, что datasource и delegate табличного представления подключены к контроллеру представления, предпочтительно в Интерфейсном Разработчике.

0 голосов
/ 13 мая 2019

Добавьте точки останова в источник данных табличного представления и функцию делегата, чтобы убедиться, что данные ожидаются от сервера.Кроме того, я вижу, что в вашей CustomCell розетки имеют необязательный тип, который не должен быть.Дополнительно проверьте функцию update(with item: CarItems), чтобы узнать, существуют ли метка и ожидаемое значение с использованием точки останова.

0 голосов
/ 12 мая 2019

Вам нужно добавить ниже строки кода в viewDid load.

tableView.dataSource = self
tableView.delegate = self

Надеюсь, это поможет вам.

...