swift json помогает в отображении данных на контроллере табличного представления - PullRequest
0 голосов
/ 01 апреля 2020
// my  url
   //  https://fetch-hiring.s3.amazonaws.com/hiring.json
    /*
    my json 
    [
    {"id": 383, "listId": 4, "name": ""},
    {"id": 472, "listId": 1, "name": ""},
    {"id": 625, "listId": 2, "name": null}
    ]
   */
// my main vc class for table view controller 

import UIKit
class HeadlLinesTableViewController: UITableViewController {
      var parse = [HiringElement]()

    override func viewDidLoad() {

        // Do any additional setup after loading the view.


        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let urlString =  "https://fetch-hiring.s3.amazonaws.com/hiring.json"
        guard let url = URL(string: urlString) else { return }

        // 2
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error != nil {
                print(error!.localizedDescription)
            }

            guard let data = data else { return }
            // 3
            //Decode data

            self.Elements = try? JSONDecoder().decode(HiringElement.self, from: data)

            print(data)

            // 4
            //Get back to the main queue
            DispatchQueue.main.async  {
                self.tableView.reloadData()
            }
            // 5
            }.resume() // fires of request

    }

Моя структура модели для моего API это то, что я использовал из генератора QuickTypeIo API

struct HiringElement: Codable {
    let id, listID: Int
    let name: String?

    enum CodingKeys: String, CodingKey {
        case id
        case listID
        case name
    }
} typealias Hiring = [HiringElement]

И мой метод контроллера представления таблицы здесь я не могу отобразить данные и некоторые некоторые ошибки. Я использую контроллер табличного представления, поэтому мне не нужен делегат табличного представления или источник данных

 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        guard let articles = Elements else { return 0 }

        return   return parse.count

    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)

            as? newsTableViewCell else {
              fatalError(" cell not found ")  }

        // here I have errors thanks 

           cell.titleLabel.text = parse[indexPath.row].name
    print(cell.titleLabel.text)


        return cell
    }

}

Вот мой класс ячеек табличного представления

import UIKit

class newsTableViewCell: UITableViewCell {
    //var article:Article!
    @IBOutlet weak var avator: UIImageView!
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var newsLabel: UILabel!



    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

    }


}

1 Ответ

1 голос
/ 01 апреля 2020

Я думаю, вы должны работать над декодированием. Вот решение:

struct HiringElement: Decodable {
    let id, listId: Int
    let name: String?
}

@propertyWrapper
struct IgnoreFailure<Value: Decodable>: Decodable {
    var wrappedValue: [Value] = []

    private struct _None: Decodable {}

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        while !container.isAtEnd {
            if let decoded = try? container.decode(Value.self) {
                wrappedValue.append(decoded)
            }
            else {
                try? container.decode(_None.self)
            }
        }
    }
}

Затем напишите следующий код в свой HeadlLinesTableViewController.swift.

typealias ArrayIgnoringFailure<Value: Decodable> = IgnoreFailure<Value>

Затем попробуйте декодировать как:

guard let objects =  try? JSONDecoder().decode(ArrayIgnoringFailure<HiringElement>.self, from: data)  else { return }
self.elements = objects.wrappedValue

Надеюсь решит ваши проблемы.

...