我试图从值中检索Main和Description,但是它没有显示在UILabel中。所有其他参数显示良好。比如温度,最高和最低温度,风速和风向。我也有天气图标的困难,需要一些指导,如果我的代码是正确的。
import UIKit
import Foundation
class ViewController: UIViewController {
var timer = Timer()
struct CurrentLocalWeather: Codable {
let base: String
let clouds: Clouds
let cod: Int
let coord: Coord
let dt: Int
let id: Int
let main: Main
let name: String
let sys: Sys
let visibility: Int
let weather: Weather
let wind: Wind
}
struct Clouds: Codable {
let all: Int
}
struct Coord: Codable {
let lat: Double
let lon: Double
}
struct Main: Codable {
let humidity: Int
let pressure: Int
let temp: Double
let tempMax: Double
let tempMin: Double
private enum CodingKeys: String, CodingKey {
case humidity, pressure, temp, tempMax = "temp_max", tempMin = "temp_min"
}
}
struct Sys: Codable {
let country: String
let id: Int
let message: Double
let sunrise: UInt64
let sunset: UInt64
let type: Int
}
struct Weather: Codable {
let description: String
let icon: String
let id: Int
let main: String
}
struct Wind: Codable {
let deg: Int
let speed: Double
}
//Variables from Storyboard
@IBOutlet weak var Temp: UILabel!
@IBOutlet weak var TempMin: UILabel!
@IBOutlet weak var TempMax: UILabel!
@IBOutlet weak var WindSpeed: UILabel!
@IBOutlet weak var Direction: UILabel!
@IBOutlet weak var Humidity: UILabel!
@IBOutlet weak var MainDesc: UILabel!
@IBOutlet weak var Description: UILabel!
@IBOutlet weak var City: UILabel!
@IBOutlet weak var SunRise: UILabel!
@IBOutlet weak var SunSet: UILabel!
@IBOutlet weak var Icon: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Define URL for Weather Data
URLSession.shared.dataTask(with: URL(string: "https://api.openweathermap.org/data/2.5/weather?lat=51.05011&lon=-114.08529&appid=<APPID_REMOVED_FOR_POSTING_PURPOSE>&units=metric")!) { data, response, error in
if let error = error {
print("Error:\n\(error)")
} else {
do {
let JSon = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
if let Temp1 = JSon["weather"]as? NSDictionary {
DispatchQueue.main.async {
self.Description.text = Temp1["description"] as? String
self.MainDesc.text = Temp1["main"] as? String
let Ico = (Temp1["icon"] as? String)!
let Icon = UIImageView()
let urlStr = NSURL(string:"http://openweathermap.org/img/w/\(Ico).png")
let urlData = NSData(contentsOf: urlStr! as URL)
if urlData == nil {
Icon.image = UIImage(data: urlData! as Data)
}
}
}
} catch let jsonError as NSError {
print("JSON error:\n\(jsonError.description)")
}
}
}.resume()
}
这是查询的结果:
{“coord”:{“lon”:-114.09,“lat”: 51.05},“天气”:[{“id”: 802,“main”:“Clouds”,“描述”:“散落的云”,“图标”:“03d”}],“base”:“station”,“main”:{“temp”: 10.9,“压力”: 1014,“湿度”: 32,“temp_min”: 8.89,“temp_max”: 13.33},“能见度”: 56326,“风”:{“速度”: 11.3,“deg”: 20},“云”:{“all”: 40},“dt”: 1556142366,“sys”:{“type”: 1,“id”: 989,“消息”: 0.0068,“国家”:“CA”,“日出”: 1556108578,“日落”: 1556160342},“id”: 5913490,“name”:“Calgary
使用< code>Decodable非常简单。
这些是省略您不想要的键的结构
struct CurrentLocalWeather: Decodable {
let main: Main
let name: String
let sys: Sys
let weather: [Weather]
let wind: Wind
}
struct Main: Decodable {
let humidity: Int
let temp: Double
let tempMin, tempMax: Double
}
struct Sys: Decodable {
let sunrise: Date
let sunset: Date
}
struct Weather: Decodable {
let description: String
let icon: String
let main: String
}
struct Wind: Codable {
let speed: Double
let deg: Int
}
要获取图标,您需要第二个数据任务,同步检索数据是非常糟糕的做法。
不遵守有关区分大小写的命名约定也是非常糟糕的做法。
class ViewController: UIViewController {
var timer = Timer()
//Variables from Storyboard
@IBOutlet weak var temp: UILabel!
@IBOutlet weak var tempMin: UILabel!
@IBOutlet weak var tempMax: UILabel!
@IBOutlet weak var windSpeed: UILabel!
@IBOutlet weak var direction: UILabel!
@IBOutlet weak var humidity: UILabel!
@IBOutlet weak var mainDesc: UILabel!
@IBOutlet weak var desc: UILabel!
@IBOutlet weak var city: UILabel!
@IBOutlet weak var sunrise: UILabel!
@IBOutlet weak var sunset: UILabel!
@IBOutlet weak var icon: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Define URL for Weather Data
URLSession.shared.dataTask(with: URL(string: "https://api.openweathermap.org/data/2.5/weather?lat=51.05011&lon=-114.08529&appid=<APPID_REMOVED_FOR_POSTING_PURPOSE>&units=metric")!) { data, response, error in
guard let data = data else { print("Error:", error!); return }
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
decoder.dateDecodingStrategy = .secondsSince1970
let result = try decoder.decode(CurrentLocalWeather.self, from: data)
guard let weather = result.weather.first else { return }
DispatchQueue.main.async {
self.desc.text = weather.description
self.mainDesc.text = weather.main
let icon = weather.icon
URLSession.shared.dataTask(with: URL(string: "http://openweathermap.org/img/w/\(icon).png")!) { iconData, _ , _ in
if let data = iconData {
DispatchQueue.main.async {
self.icon.image = UIImage(data: data)
}
}
}.resume()
}
} catch {
print("JSON error:", error)
}
}.resume()
}
}
通过进行以下更改,我能够解决字符串值未显示的问题。
Import UIKit
import Foundation
class ViewController: UIViewController {
var timer = Timer()
//Variables from Storyboard
@IBOutlet weak var Temp: UILabel!
@IBOutlet weak var TempMin: UILabel!
@IBOutlet weak var TempMax: UILabel!
@IBOutlet weak var WindSpeed: UILabel!
@IBOutlet weak var Direction: UILabel!
@IBOutlet weak var Humidity: UILabel!
@IBOutlet weak var MainDesc: UILabel!
@IBOutlet weak var Description: UILabel!
@IBOutlet weak var City: UILabel!
@IBOutlet weak var SunRise: UILabel!
@IBOutlet weak var SunSet: UILabel!
@IBOutlet weak var Icon: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Define URL for Weather Data
URLSession.shared.dataTask(with: URL(string: "https://api.openweathermap.org/data/2.5/weather?lat=51.05011&lon=-114.08529&appid=<APPID_REMOVED_FOR_POSTING_PURPOSE>&units=metric")!) { data, response, error in
if let error = error {
print("Error:\n\(error)")
} else {
do {
let JSon = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String: AnyObject]
let weatherData = (JSon["weather"]as! NSArray)
if let Temp1 = weatherData[0] as? NSDictionary {
DispatchQueue.main.async {
self.Description.text = Temp1["description"] as? String
self.MainDesc.text = Temp1["main"] as? String
let Ico = (Temp1["icon"] as? String)!
let urlStr = NSURL(string:"http://openweathermap.org/img/w/\(Ico).png")
let urlData = NSData(contentsOf: urlStr! as URL)
if urlData != nil {
self.Icon.image = UIImage(data: urlData! as Data)
}
}
}
} catch let jsonError as NSError {
print("JSON error:\n\(jsonError.description)")
}
}
}.resume()
}
我仍然坚持让图标工作,希望我也应该能够发布它。对于那些尝试使用Codable并做对的人,请分享。
我正在使用 ChartJS (v2.9) 根据时间序列数据对分类 y 轴标签进行气泡图绘制。 我看到奇怪的行为,因为如果y轴类别在字符串中的任何位置都有一个数值,则尽管标签仍然存在,但不会绘制数据。 如果我编辑它,使其没有数值,则数据绘制正常。 将数据记录到控制台看起来很好,没有错误。 我已经在许多数据集中看到了这一点。有人在ChartJS气泡图中看到过这种行为吗?你能解决它吗? 提前致谢...
问题内容: 有没有一种方法或如何使用Java开发Java字符串并从中创建位图? 我看了一下Java API的位图,找不到任何东西 问题答案: 您可以使用位图工厂的encodebytearray方法,例如 其中myImageData是base64字符串。 如果您有一个数组,则将其传递给encodeByteArray方法。
我正在做一个天气应用程序。整个应用程序都完成了,除夜间图标外,一切正常。我已经设置了当天的图标。但我不知道如何在一个条件下设置两个不同的图标来检查时间,如果当天显示的是太阳 这是我的代码: 请帮帮我。
抬手即可在天气手表表盘中查看当天的每小时预报以及明天的 3 小时预报和后天的 6 小时预报。提供的其他天气信息包括风速、风向、湿度和降水概率。 只能在天气手表表盘中查看天气信息。在时间视图中,向左或者向右滑动以找到天气信息。 要使用天气功能,您需要在手机上安装 Flow 应用程序并与手表配对。您还需要开启定位服务 (iOS) 或定位设置 (Android) 才能获取天气信息。 今日预报 预报位置
抬手即可在天气手表表盘中查看当天的每小时预报以及明天的 3 小时预报和后天的 6 小时预报。提供的其他天气信息包括风速、风向、湿度和降水概率。 只能在天气手表表盘中查看天气信息。在时间视图中,向左或者向右滑动以找到天气信息。 要使用天气功能,您需要在手机上安装 Flow 应用程序并与手表配对。您还需要开启定位服务 (iOS) 或定位设置 (Android) 才能获取天气信息。 今日预报 预报位置
我有一个正在解析的JSON字符串,我想检索字段“pr_num”的值。我收到这个错误: 我的代码如下: 我想获取字段的值,它们是690052和null。 jsonString如下所述