【问题标题】:Display information from decoded JSON in a UILabel (Swift 4)在 UILabel (Swift 4) 中显示来自解码 JSON 的信息
【发布时间】:2018-11-29 00:05:38
【问题描述】:

我正在尝试显示从 JSON 中获取的信息。我已经使用 .decode 来获取它。现在我想把它的文本放到我故事板上的一个简单标签上。在“.resume()”下的底部是我的尝试,但它不起作用。我似乎无法弄清楚这一点。


import UIKit


struct WebsiteDescription: Decodable {
    var name : String
    var description : String
    var courses : [Course]

}


struct Course: Decodable {
    let id: Int
    let name: String
    let link: String
    let imageUrl: String
}

class ViewController: UIViewController {

    @IBOutlet weak var displayLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
        guard let url = URL(string: jsonUrlString) else {return}
        URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}

            do {
                let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
                print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
                //let courses = try JSONDecoder().decode([Course].self, from: data)
            } catch let jsonErr {
                print("Error serializing json", jsonErr)
            }

        }.resume()

        let displayLabel.text = websiteDescription.name

    }

}

【问题讨论】:

    标签: ios json swift decode


    【解决方案1】:

    您需要在 do 方法中更新您的标签。此外,您应该从主线程执行此操作,以便可以更新 UI。我已经更新了下面的代码。

    import UIKit
    
    struct WebsiteDescription: Decodable { 
        var name : String 
        var description : String 
        var courses : [Course]
    }
    
    struct Course: Decodable { 
        let id: Int 
        let name: String 
        let link: String 
        let imageUrl: String 
    }
    
    class ViewController: UIViewController {
    
        @IBOutlet weak var displayLabel: UILabel!
    
        override func viewDidLoad() {
        super.viewDidLoad()
    
            let jsonUrlString = "https://api.letsbuildthatapp.com/jsondecodable/website_description"
            guard let url = URL(string: jsonUrlString) else {return}
            URLSession.shared.dataTask(with: url) { (data, response, err) in
            guard let data = data else {return}
    
            do {
                let websiteDescription = try JSONDecoder().decode(WebsiteDescription.self, from: data)
                print(websiteDescription.name, websiteDescription.description, websiteDescription.courses)
                //let courses = try JSONDecoder().decode([Course].self, from: data)
    
                DispatchQueue.main.async {
                    self.displayLabel.text = websiteDescription.name
                }
    
             } catch let jsonErr {
                print("Error serializing json", jsonErr)
            }
    
        }.resume()
    }
    

    【讨论】:

    • 这是救命稻草。谢谢@Cedan!
    • @Westopher:很高兴这个答案对你有用。请投票并接受答案以确认它。
    • @Westopher 欢迎您。请投票并接受这个作为答案。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多