首页 > 解决方案 > 返回字符串并在 NSTextField 中显示(SwiftUI / macOS App)

问题描述

我有以下问题:我想制作一个显示太阳信息的应用程序。我已经设法在控制台中打印了日出,但这不是最终目标。我想在 NSTextField 中显示它。这就是它开始出现问题的地方。

我试图self.sunrise1.stringValue = sunriseprivate func getData(). 显然这不起作用,Xcode 告诉我,

NSControl.stringValue 只能在主线程中使用

所以现在我想我必须返回sunrise变量。但是当我添加return(sunrise)Xcode 时显示错误:

意外的非无效返回错误

所以我的问题是,如何在标签中显示stringValueof ?sunrisesunrise1

class ViewController: NSViewController {
    
    @IBOutlet weak var sunrise1: NSTextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let url = "https://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400"
        getData(from: url)
        

        // Do any additional setup after loading the view.
    }
    
    private func getData(from url: String) {
        
        let task = URLSession.shared.dataTask(with: URL(string: url)!, completionHandler: {data, response, error in
            
            guard let data = data, error == nil else {
                print("something went wrong")
                return
            }
            
            var result: Response?
            do {
                result = try JSONDecoder().decode(Response.self, from: data)
            }
            catch {
                print("failed to convert \(error.localizedDescription)")
            }
            
            guard let json = result else {
                return
            }
            
            let sunrise = json.results.sunrise
        
            print(sunrise)
            
        })task.resume()
    }

}

struct Response: Codable {
    let results: MyResult
    let status: String
}

struct MyResult: Codable {
    let sunrise: String
    let sunset: String
    let solar_noon: String
    let day_length: String
    let civil_twilight_begin: String
    let civil_twilight_end: String
    let nautical_twilight_begin: String
    let nautical_twilight_end: String
    let astronomical_twilight_begin: String
    let astronomical_twilight_end: String
    
}

标签: swiftxcodeapiuikit

解决方案


在主队列上进行分配,例如

DispatchQueue.main.async { [weak self] in
   self?.sunrise1.stringValue = sunrise
}

推荐阅读