Отображение данных, которые я получаю из JSON - PullRequest
0 голосов
/ 07 декабря 2018

У меня JSON звонок от Darksky API, я получаю JSON и данные, которые мне нужны.Проблема в том, что я не могу понять, как отобразить temperature, например, что я получаю из API.У меня есть структура погоды, в которой я выполняю вызов JSON, это структура погоды:

import UIKit

struct Weather{
    static let basePath: String = "https://api.darksky.net/forecast/MY_API_KEY_IS_HERE/"

    let time: Int
    let icon: String
    let temperature: Double

    enum SerializationError: Error{
        case missing(String)
        case invalid(String, Any)
    }

    init(json:[String:Any]) throws{
        guard let time = json["time"] as? Int else {throw SerializationError.missing("Time is missing.")}
        guard let icon = json["icon"] as? String else { throw SerializationError.missing("Icon missing")}
        guard let temperature = json["temperatureMax"] as? Double else {throw SerializationError.missing("temp is missing.")}

        self.time = time
        self.icon = icon
        self.temperature = temperature
    }

    static func forecast(withLocation location: String, completion: @escaping ([Weather]) -> ()){
        let url = basePath + location
        let request = URLRequest(url: URL(string: url)!)

        let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in

            var forecastArray: [Weather] = []
            if let data = data{
                do{
                    if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String:Any]{
                        if let dailyForecast = json["daily"] as? [String:Any]{
                            if let dailyData = dailyForecast["data"] as? [[String:Any]]{
                                for dataPoint in dailyData{
                                    if let weatherObject = try? Weather(json: dataPoint){
                                        forecastArray.append(weatherObject)
                                    }
                                }
                            }
                        }
                    }
                }catch{
                    print(error.localizedDescription)
                }
                completion(forecastArray)
            }
        }
        task.resume()
    }
}

Я не могу понять, как взять массив, который у меня есть, и поместить данные в погодуЯчейки, которые являются простой ячейкой CollectionView.Это ячейка: import UIKit

    class ForecastCell: UICollectionViewCell{


    var mDayLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont.boldSystemFont(ofSize: 14)
        label.textColor = UIColor.white

        label.translatesAutoresizingMaskIntoConstraints = false
        return label
    }()

    var mWeatherIcon: UIImageView = {
        let image = UIImageView(image: UIImage(named: "partly-cloudy"))
        image.contentMode = .scaleAspectFit
        image.clipsToBounds = true
        image.translatesAutoresizingMaskIntoConstraints = false
        return image
    }()

    var mTempLabel: UILabel = {
        let label = UILabel()
        label.font = UIFont.boldSystemFont(ofSize: 12)
        label.textColor = UIColor.white

        label.translatesAutoresizingMaskIntoConstraints =  false
        return label
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)

        setupDayLabel()
        setupTempLabel()
        setupWeatherIcon()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupDayLabel(){
        self.addSubview(mDayLabel)
        mDayLabel.text = "Sunday"

        mDayLabel.topAnchor.constraint(equalTo: self.safeAreaLayoutGuide.topAnchor, constant: 8).isActive = true
        mDayLabel.centerXAnchor.constraint(equalTo: self.safeAreaLayoutGuide.centerXAnchor).isActive = true
    }

    private func setupWeatherIcon(){
        self.addSubview(mWeatherIcon)

        mWeatherIcon.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
        mWeatherIcon.centerYAnchor.constraint(equalTo: contentView.centerYAnchor
).isActive = true
        mWeatherIcon.widthAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 0.8).isActive = true
        mWeatherIcon.heightAnchor.constraint(equalTo: contentView.heightAnchor, multiplier: 0.8).isActive = true
    }

    private func setupTempLabel(){
        self.addSubview(mTempLabel)
        mTempLabel.text = "12"

        mTempLabel.centerXAnchor.constraint(equalTo: self.safeAreaLayoutGuide.centerXAnchor).isActive = true
        mTempLabel.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: -8).isActive = true
    }
}

Я действительно не понимаю, где именно я должен отображать данные (в UIController?) И как это сделать.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Внутри вашего vc do

var content = [Weather]() 
Weather.forecast(withLocation:<#loc#>) { (arr) in
 DispatchQueue.main.async {
    content = arr
    self.collectionView.reloadData()
 }
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
  return content.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
   let cell = /////// 
   let item = content[indexPath.row] 
   // set cell items here or create configure method in the cell class and pass the model , then set it there 
   return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...