У меня проблема tableViewCells пустая после разбора JSON - PullRequest
0 голосов
/ 13 марта 2020

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

Для просмотра таблицы я создал DailyWeatherViewCell.swift

import Foundation
import UIKit

 class DailyWeatherViewCell:   UITableViewCell {

@IBOutlet weak var  dayLabel: UILabel!
@IBOutlet weak var weatherLabe: UILabel!
@IBOutlet weak var minMaxTempLabel: UILabel!

}

Таким образом я проанализировал JSON Импорт импорта ViewController.swift UIKit Import Foundation

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var cityNameLabel: UILabel!
@IBOutlet weak var temperatureLabel: UILabel!
@IBOutlet weak var weatherNowLabel: UILabel!
@IBOutlet weak var dailyWeatherTableView: UITableView!

var model: WeatherForecast?
var degreeSymbol = "º"


override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    currentWeatherRequest()
    dailyWeatherTableView.delegate = self
    dailyWeatherTableView.dataSource = self

}
func currentWeatherRequest() {
let session = URLSession.shared
    let weatherURL = URL(string: "http://api.openweathermap.org/data/2.5/forecast?q=Atlanta,us&units=metric&APPID=c866a73a7aaaa3f2813b5930d028f514")!
let dataTask = session.dataTask(with: weatherURL) { (data: Data?,response: URLResponse?,error: Error?) in
        if let error = error {
            print("Error:\n\(error)")

        } else {
            if let jsonData = data {

                do {
                    let dataString = String(data: jsonData, encoding: String.Encoding.utf8)
          print("Daily weather data:\n\(dataString!)")
                let decoder = JSONDecoder()
                    let responseModel = try decoder.decode(WeatherForecast.self, from: jsonData)
              print(responseModel)
                    self.dailyWeatherTableView.reloadData()
                    DispatchQueue.main.async {
                        self.cityNameLabel.text = responseModel.city.name
                        self.temperatureLabel.text = "\(String(describing: responseModel.list[0].main.temp))\(self.degreeSymbol)"
                        self.weatherNowLabel.text = String(describing: responseModel.list[0].weather[0].main)
                    }

                } catch let error {
                  print("Error: \(error)")
                }
            }else {
            print("Error: did not receive data")

        }
        }
    }
    dataTask.resume()

}



public func tableView(_ tableView:         UITableView, numberOfRowsInSection section: Int) -> Int {
return self.model?.list.count ?? 0
   }
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell: DailyWeatherViewCell = tableView.dequeueReusableCell(withIdentifier: "DailyWeatherViewCell", for: indexPath) as! DailyWeatherViewCell
   // let forecast: DailyForecast = (model?.ForecastforToday?[indexPath.row])
    let dateFormatter = DateFormatter()
    let date = Date(timeIntervalSince1970: TimeInterval((model?.list[0].dt)! as Int))
    dateFormatter.locale = Locale(identifier: "ru_US")
    dateFormatter.setLocalizedDateFormatFromTemplate("MMMMd")
    cell.dayLabel.text = dateFormatter.string(from: date)
    print(date)
    cell.minMaxTempLabel.text = "\(String(describing: model?.list[0].main.tempMin))\(self.degreeSymbol)\(String(describing: model?.list[0].main.tempMax))"
    print("\(String(describing: model?.list[0].main.tempMin))\(self.degreeSymbol)\(String(describing: model?.list[0].main.tempMax))")
    cell.weatherLabe.text = "\(String(describing: model?.list[0].weather[0].main))"
    print("\(String(describing: model?.list[0].weather[0].main))")
return cell
   }

}

У меня есть эта структура для разбора JSON Данные WeatherForecast как Дата в формате: день месяца (как 23 мая) и основной погодный ресурс должен быть помещен в dailyWeatherViewCell weatherLabel в следующем хотите добавить systemIcon и minTemp и maxTemp to minMaxTempLabel

WeatherForecast.swift

import Foundation
import UIKit
// MARK: - WeatherForecast
struct WeatherForecast: Codable {
let cod: String
let message, cnt: Int
let list: [List]
let city: City
}

// MARK: - City
struct City: Codable {
let id: Int
let name: String
let coord: Coord
let country: String
let population, timezone, sunrise, sunset: Int
}

// MARK: - Coord
struct Coord: Codable {
let lat, lon: Double
}

// MARK: - List
struct List: Codable {
let dt: Int
let main: MainClass
let weather: [Weather]
let clouds: Clouds
let wind: Wind
let sys: Sys
let dtTxt: String
let rain, snow: Rain?

enum CodingKeys: String, CodingKey {
    case dt, main, weather, clouds, wind, sys
    case dtTxt = "dt_txt"
    case rain, snow
}

}

// MARK: - Clouds
struct Clouds: Codable {
let all: Int
}

// MARK: - MainClass
struct MainClass: Codable {
let temp: Double
let feelsLike, tempMin, tempMax: Double
let pressure, seaLevel, grndLevel, humidity: Int
let tempKf: Double

enum CodingKeys: String, CodingKey {
    case temp = "temp"
    case feelsLike = "feels_like"
    case tempMin = "temp_min"
    case tempMax = "temp_max"
    case pressure
    case seaLevel = "sea_level"
    case grndLevel = "grnd_level"
    case humidity
    case tempKf = "temp_kf"
   }
}

// MARK: - Rain
struct Rain: Codable {
let the3H: Double

enum CodingKeys: String, CodingKey {
    case the3H = "3h"
}
}

// MARK: - Sys
struct Sys: Codable {
let pod: Pod
}

enum Pod: String, Codable {
case d = "d"
case n = "n"
}

// MARK: - Weather
struct Weather: Codable {
let id: Int
let main: MainEnum
let weatherDescription, icon: String

enum CodingKeys: String, CodingKey {
    case id
    case main
    case weatherDescription = "description"
    case icon
}


}

enum MainEnum: String, Codable {
case clear = "Clear"
case clouds = "Clouds"
case rain = "Rain"
case snow = "Snow"
}

// MARK: - Wind
struct Wind: Codable {
let speed: Double
let deg: Int

} Буду рад вашей помощи

1 Ответ

0 голосов
/ 13 марта 2020

Первый: вам нужно проверить UITableViewDelegate, UITableViewDataSource

в viewDidLoad()

   dailyWeatherTableView.delegate = self
   dailyWeatherTableView.dataSource = self

Второй: назначить декодирование JSON Данные для вашей модели

Так что замените это let responseModel = try decoder.decode(Weather.self, from: jsonData) с self.model = try decoder.decode(Weather.self, from: jsonData)

другое решение, которое вы можете назначить responseModel для model, поэтому добавьте эту строку self.model = responseModel

после назначения, добавьте dailyWeatherTableView.reloadData()

Наконец, реализовать tableView delegates, dataSource

extension ViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return model?.list.count ?? 0 // number of cells 
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       guard let cell = tableView.dequeueReusableCell(withIdentifier: "DailyWeatherViewCell", for: indexPath) as? DailyWeatherViewCell else { return UITableViewCell() }
       // configure cell data 
        return cell
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...