swift - 返回字符串并在 NSTextField 中显示(SwiftUI / macOS App)
问题描述
我有以下问题:我想制作一个显示太阳信息的应用程序。我已经设法在控制台中打印了日出,但这不是最终目标。我想在 NSTextField 中显示它。这就是它开始出现问题的地方。
我试图self.sunrise1.stringValue = sunrise
在private func getData()
. 显然这不起作用,Xcode 告诉我,
NSControl.stringValue 只能在主线程中使用
所以现在我想我必须返回sunrise
变量。但是当我添加return(sunrise)
Xcode 时显示错误:
意外的非无效返回错误
所以我的问题是,如何在标签中显示stringValue
of ?sunrise
sunrise1
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
}
解决方案
在主队列上进行分配,例如
DispatchQueue.main.async { [weak self] in
self?.sunrise1.stringValue = sunrise
}
推荐阅读
- java - 正则表达式模式以查找模式的出现
- python - Vscode 中的 Python 调试 - 使其类似于 PyCharm?
- azure-devops - Azure DevOps 管道触发问题消息不会消失
- javascript - 如何使用javascript删除具有特定类的li中的重复ID?
- r - 如果使用预期比例而不是 R 中的计数,则卡方结果不相等
- vue.js - 努力访问vuex的状态
- android - 使用 ViewModel 和 LiveData 多次改造执行 API
- c++ - 从用户的输入创建一个链表程序
- python-3.x - 直接将输出文件下载到客户端桌面
- r - R中数字纬度和经度值的XPath?