Представление таблицы с данными JSON в Swift 4.2 - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в Swift, и я в своем уме, поэтому, пожалуйста, будьте добры ко мне.

Я создаю приложение, которое загружает данные с URL, публикуя определенный идентификатор и получая обратноМассив JSON.JSON выглядит следующим образом:

[{"group":"500","from":"2019-01-01","to":"2019-01-05"},{...}]

Он имеет номер группы как «группа» и дату начала «с» и дату окончания «до».

Я хочу разрешитьразличные группы показаны в табличном представлении с датами с и до .Мне удалось загрузить данные правильно, но мне не удалось показать их в виде таблицы.

Мой код ниже.Может быть, кто-то из вас может узнать, что я сделал неправильно.

Когда я запускаю проект, я получаю пустую таблицу.

    import UIKit

   typealias Fahrten = [FahrtenElement]

struct FahrtenElement: Codable {
    let group: String?
    let from: String?
    let to: String?

    enum CodingKeys: String, CodingKey {
        case group = "group"
        case from = "from"
        case to = "to"
    }
}

    class BookingsController: UITableViewController {

        var tableview: UITableView!
        var groups = [Fahrten]()


        // MARK: - Table view data source

        override func viewDidLoad() {
            super.viewDidLoad()
            downloadData()
        }

        override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
            let label = UILabel()
            label.text = "Groups"
            label.backgroundColor = .yellow

            return label
        }


        // Section
        override func numberOfSections(in tableView: UITableView) -> Int {
            return 1
        }

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

        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
            //lblname to set the title from response
            cell.textLabel?.text = "Group \(String(describing: groups[indexPath.row].group))"
            cell.detailTextLabel?.text = "From \(String(describing: groups[indexPath.row].from)) to \(String(describing: groups[indexPath.row].to))"
            return cell
        }

        func downloadData() {
            let id = "..."

            let url = URL(string: "...")!

            // request url
            var request = URLRequest(url: url)

            // method to pass data POST - cause it is secured
            request.httpMethod = "POST"

            // body gonna be appended to url
            let body = "id=(\(id))"

            // append body to our request that gonna be sent
            request.httpBody = body.data(using: .utf8)

            URLSession.shared.dataTask(with: request) { (data, response, err) in



guard let data = data else { return }


            do {

               let groups = try JSONDecoder().decode(Fahrten.self, from: data)

                print(groups)                        
self.tableview.reloadData() // I get an crash here: Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value                    }
                } catch let jsonErr {
                    print("Error serializing json:", jsonErr)
                }

                }.resume()
        }

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Из того, что я вижу, похоже, что вы очищаете массив и не перезагружаете данные.

Вы должны присвоить результирующее свойство groups значение self.groups, а затем перезагрузить данные.

DispatchQueue.main.async {
    self.groups = groups // change here
    self.tableview.reloadData()
}
0 голосов
/ 11 марта 2019

Попробуйте этот код.

Ваша модель.

typealias Fahrten = [FahrtenElement]

struct FahrtenElement: Codable {
    let group: String
    let from: String
    let to: String

    enum CodingKeys: String, CodingKey {
        case group = "group"
        case from = "from"
        case to = "to"
    }
}

Используйте это, я использую это с локальным JSON с той же структурой.

func getFehData(){
    let url = Bundle.main.url(forResource: "fah", withExtension: "json")!
    do {
        let jsonData = try Data(contentsOf: url)
        let fahrten = try? JSONDecoder().decode(Fahrten.self, from: jsonData)

        print(fahrten)
    }
    catch {
        print(error)
    }
}

Вывод: (фиктивные данные)

* +1012 *enter image description here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...