Табличное представление с данными JSON в Swift 4.2

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

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

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

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

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

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

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

    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()
        }

добавьте tableview.dataSource=true и раскомментируйте эту строку: self.tableview.reloadData() после self.groups = [Fahrten]()

Arnab 11.03.2019 12:38

зачем ты это прокомментировал?? // self.tableview.reloadData()

Dimple 11.03.2019 12:41

Я получаю сбой в "self.tableview.reloadData()". "Тема 1: Неустранимая ошибка: Неожиданно найдено nil при распаковке необязательного значения"

Yannick Fitch 11.03.2019 13:59

Ваш tableView равен нулю? может быть? вы вызываете только downloadData в viewDidLoad? как вы инициализируете контроллер представления?

Scriptable 11.03.2019 14:14

Попробуйте добавить точку останова в эту строку и войдите в код. проверьте значения в инспекторе, чтобы проверить на ноль

Scriptable 11.03.2019 14:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
575
2

Ответы 2

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

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

DispatchQueue.main.async {
    self.groups = groups // change here
    self.tableview.reloadData()
}

Когда я перезагружаю данные, я получаю «Поток 1: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения» :(

Yannick Fitch 11.03.2019 13:07

@SörenYannickSeitz Я думаю, вы поняли это в своей функции tableView:cellForRowAt:, попробуйте отладить ее или добавить несколько операторов печати.

Joakim Danielson 11.03.2019 13:25

Возможно, .group, .from или .to в одном из элементов равно нулю, но с String! вы говорите Swift, что они никогда не будут равны нулю. Попробуйте изменить их на String?.

Mattia C. 11.03.2019 15:31

По-прежнему возникает та же ошибка: «Поток 3: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения». Я проверил их с помощью оператора печати, и ни одно из значений не равно нулю.

Yannick Fitch 11.03.2019 16:15

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

Scriptable 11.03.2019 16:17

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

Ваша модель.

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)
    }
}

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

Это дает мне ошибку: «Недопустимое преобразование из бросающей функции типа '() throws -> ()' в негенерирующую функцию типа '@convention (block) () -> Void'"

Yannick Fitch 11.03.2019 13:30

@SörenYannickSeitz Проверить Изменить ответ.

dahiya_boy 11.03.2019 14:00

Пожалуйста, добавьте описание того, что вы сделали и как это решает проблему. Это сделано для того, чтобы помочь будущим читателям, которые ищут решение, подобное тому, которое есть у OP.

Joakim Danielson 11.03.2019 14:16

@dahiya_boy Я получаю сообщение об ошибке, когда перезагружаю данные. «Тема 8: Неустранимая ошибка: неожиданно найдено nil при развертывании необязательного значения»

Yannick Fitch 11.03.2019 16:06

@SörenYannickSeitz В какой строке вы получили ошибку? Что на самом деле вы делаете, делаете из моего ответа или другого ответа?

dahiya_boy 12.03.2019 05:39

@dahiya_boy Я обновил его выше. Я не могу найти, где значение равно нулю.

Yannick Fitch 12.03.2019 17:20

@SörenYannickSeitz Пожалуйста, дайте пример проекта с этой проблемой. Я разберусь с проблемой, иначе мне не удастся решить эту проблему.

dahiya_boy 13.03.2019 05:26

Другие вопросы по теме