gpt4 book ai didi

ios - 我试图从我的主 ViewController 调用一个函数,并使用它在我的第二个 ViewController 中加载 JSON 数据

转载 作者:行者123 更新时间:2023-11-30 11:14:38 25 4
gpt4 key购买 nike

我正在为 iOS 制作一个天气应用程序,我试图从我的主 ViewController 中调用一个变量,以便在我的第二个 ViewController 中使用,我正在使用 OpenWeatherMap 中的 API 数据来显示天气数据,这在主视图 Controller ,我希望它显示在第二个 View Controller 上,作为“高级详细信息”部分,它将显示最大/最小温度和气压等(人们不关心的事情)。

我已经制作了主视图 Controller “var myCustomViewController: ViewController = ViewController (nibName: nil, bundle: nil)”的一个实例,它工作正常,并且我可以从主视图 Controller 调用标签、变量、文本框等,但我无法调用变量“weatherData”,它是 JSON 数据的解码器。

在我的第二个 View Controller 中,我想说“if let gmain = (myCustomViewController.weatherData.main.tempmax”,例如,以获得最高温度,但它无法识别“weatherData”。我很卡住对此,我们将不胜感激。谢谢。

下面我的主视图 Controller 中的结构:

struct Coordinate : Decodable {
let lat, lon : Double?
}

struct Weather : Decodable {
var id : Int?
var main, myDescription, icon : String?

enum CodingKeys : String, CodingKey {
case id = "id"
case main = "main"
case icon = "icon"
case myDescription = "description"
}
}

struct Sys : Decodable {
let type, id : Int?
let sunrise, sunset : Date?
let message : Double?
let country : String?
}

struct Main : Decodable {
let temp, tempMin, tempMax : Double?
let pressure, humidity : Int?
}

struct Wind : Decodable {
let speed : Double?
let deg : Int?
}

struct MyWeather : Decodable {
let coord : Coordinate?
let cod, visibility, id : Int?
let name : String?
let base : String?
let weather : [Weather]?
let sys : Sys?
let main : Main?
let wind : Wind?
let dt : Date?
}

主ViewController代码如下:

let text: String = userValue.text!



guard let APIUrl = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=" + text + "&appid=e7b2054dc37b1f464d912c00dd309595&units=Metric") else { return }
//API KEY

URLSession.shared.dataTask(with: APIUrl) { data, response, error in
guard let data = data else { return }


let decoder = JSONDecoder()
//Decoder

do {
let weatherData = try decoder.decode(MyWeather.self, from: data)

if (self.MainLabel != nil)
{
if let gmain = (weatherData.weather?.first?.main) { //using .first because Weather is stored in an array
print(gmain)
DispatchQueue.main.async {
self.MainLabel.text! = String (gmain)
}
}

}


if (self.LocationLabel != nil)
{
if let gmain = weatherData.name {
print(gmain)
DispatchQueue.main.async {
self.LocationLabel.text! = "Current Weather in: " + String (gmain)
}
}
}

下面的第二个 ViewController 代码:

    var myCustomViewController: ViewController = ViewController (nibName: nil, bundle: nil) //Inheriting from other viewController

if (self.descriptionLabel != nil)
{
if let gmain = (myCustomViewController.weatherData { //NOT RECOGNISING weatherData <<<<<
print(gmain)
DispatchQueue.main.async {
self.descriptionLabel.text! = String (gmain)
}
}
}

}

最佳答案

在您的 MainViewController 代码中,您有以下行:

let weatherData = try decoder.decode(MyWeather.self, from: data)

这是在一个方法中吗,比如viewDidLoad?如果是这样,则 weatherData 不是 MainViewController 的属性,并且不能由子类访问。您必须将其定义为任何函数范围之外的属性(例如,在文件顶部,在左括号之后):

var weatherData = ...

然后这样调用它:

do {
weatherData = ...

关于ios - 我试图从我的主 ViewController 调用一个函数,并使用它在我的第二个 ViewController 中加载 JSON 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51867659/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com