如何使用自定义对象填充表格视图?

时间:2018-11-11 15:45:22

标签: swift uitableview codable

我有一个符合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。但是,在对象Weather中,我要填充validTime ie 01/01/2018 12:00,并用与之匹配的“ {温度”和相应的name来匹配values。 , ie 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 :(得分:0)

您可以访问一个空数组,这样

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

答案 1 :(得分:0)

如果只想一个部分,则不必设置。删除以下代码行:

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

现在,如果您希望每个timeEvent具有一个表格视图单元格,则应创建天气对象

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
}

答案 2 :(得分:0)

如果没有节,则无需实现numberOfSections(in tableView: UITableView)

如果仅使用单个Weather对象,为什么不将testWeatherObject的定义更改为

var testWeatherObject = [TimeEvents]

,然后您的numberOfRowsInSection将变为

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

答案 3 :(得分:0)

由于您要访问的嵌套数组为空而崩溃。

我会先检查testWeatherObjects.count是否是0。如果没有,那么您可以继续使用testWeatherObject[section].timeEvents.count

答案 4 :(得分:0)

在情节提要或xib中定义的单元格标识符是否与“ WeatherDataCell”匹配?

我制作了一个简单的tableview应用示例。 https://github.com/y-okudera/TableViewDemoApp

希望能对您有所帮助。