Как заполнить табличное представление пользовательским объектом? - PullRequest
0 голосов
/ 11 ноября 2018

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

struct Weather: Codable {
    let time: Date
    let location: String
    let timeEvents: [TimeEvents]
}  

struct TimeEvents: Codable {
    let validTime: Date
    let parameters: [Parameters]
}

struct Parameters: Codable {
    let name: String
    let unit: String
    let values: [Double]
}

Я получаю один объект Погода.Однако внутри объекта Weather я хочу заполнить validTime, , т.е. 01/01/2018 12:00, с соответствующей name соответствующей "температурой" и соответствующей values, то есть 10.5 C.

Таким образом, строки будут выглядеть примерно так:

[01/01/2018 12:00 : 10.5C]
[01/01/2018 13:00 : 11.5C]
[01/01/2018 14:00 : 11.6C]
.
.
.
[02/01/2018 00:00 : 3.1C]
[02/01/2018 01:00 : 3.1C]

В моем контроллере у меня есть что-то вроде:

var testWeatherObject : [Weather] = []

Мне нужен только один заголовок вверхняя часть отображает одно местоположение , т. е. Нью-Йорк.

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

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return testWeatherObject[section].timeEvents.count
}

Выше вылетает мое приложение.Я не уверен, как получить правильное количество строк.

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

    return cell
}

Ответы [ 5 ]

0 голосов
/ 11 ноября 2018

Идентификатор ячейки, определенной в раскадровке или в xib, соответствует «WeatherDataCell»?

Я сделал простой пример табличного приложения. https://github.com/y-okudera/TableViewDemoApp

Я надеюсь быть полезным.

0 голосов
/ 11 ноября 2018

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

Я бы проверил, является ли testWeatherObjects.count первым 0. Если нет, то вы можете пойти дальше и использовать testWeatherObject[section].timeEvents.count

0 голосов
/ 11 ноября 2018

Если вы хотите иметь только один раздел, вам не нужно устанавливать это. Удалить эти строки кода:

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

А теперь, если вы хотите, чтобы каждый раз для каждой таблицы отображалась одна ячейка таблицы, вы должны создать свой погодный объект

var testWeatherObject = // your Weather object

и в методе источника данных numberOfRowInSection просто скажите, что я хочу столько ячеек, сколько у testWeatherObject есть timeEvents

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

Однако я рекомендую не использовать ваш объект Weather в качестве переменной. Вместо этого вы должны создать массив TimeEvents

var timeEvents = [/* your TimeEvents objects*/]

и в методе источника данных табличного представления используйте только это

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return timeEvents.count
}
0 голосов
/ 11 ноября 2018

Если у вас нет разделов, вам не нужно реализовывать numberOfSections(in tableView: UITableView)

Если вы работаете только с одним объектом Weather, почему бы не изменить определение testWeatherObject на

var testWeatherObject = [TimeEvents]

и ваш numberOfRowsInSection станет

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
   return testWeatherObject.count
}
0 голосов
/ 11 ноября 2018

Вы можете получить доступ к пустому массиву, так что

return testWeatherObject.first?.timeEvents.count ?? 0
...