Search code examples
jsonswiftuilabelurlsession

How to link decoded json to uilabels in swift?


I want to link the decoded JSON to my UILabels in my view. How can I do that? the struct given below is which I have decoded below and able to print it out. But I try to link labels to those decoded data.

struct Details:Decodable{
    var deaths : Int
    var recovered : Int
    var active : Int
    var critical : Int
    var cases : Int
    var tests:Int
    var todayCases:Int
    var todayDeaths:Int
    var todayRecovered:Int   
}

I did the parsing in viewDidLoad

class ViewController: UIViewController {
    
    var detailData:Details!
    
    @IBOutlet weak var infected: UILabel!
    @IBOutlet weak var active: UILabel!
    @IBOutlet weak var recovered: UILabel!
    @IBOutlet weak var death: UILabel!
    @IBOutlet weak var totalTested: UILabel!
    
    
                                //MARK: - View DID LOAD
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
                                //MARK: - BASIC EDIT
        
        title = "Neporona"
        let group = [infected,active,recovered,death,totalTested]
        for i in group{
            i!.layer.masksToBounds = true
            i!.layer.cornerRadius = 20
        }
        
        
        //MARK: - JSON DECODING
        
        guard let url = URL(string: "https://corona.lmao.ninja/v2/countries/nepal?yesterday=false") else { return }
        
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            
            guard let data = data else { return }

            
            do{
                let decoder = try JSONDecoder().decode(Details.self, from: data)
                self.detailData = decoder
                print(self.detailData!)
            }
            catch{
                print(error.localizedDescription)
            }
            
        }.resume()
    }
}

Solution

  • You can update labels on didSet of detailData as below,

    var detailData:Details! {
        didSet {
             DispatchQueue.main.async {
                 self.infected.text = String(self.detailData.cases)
                 self.active.text = String(self.detailData.active)
                 self.recovered.text = String(self.detailData.recovered)
             }
        }
    }