【发布时间】:2025-11-23 10:00:02
【问题描述】:
我正在尝试将 JSON 值传递给另一个 ViewController,在这种情况下,它是对用户希望进入的任何城市的当前天气的描述。我让它在我的主视图控制器 (ViewController) 上很好地获取和显示 JSON 数据,但我想让它显示在我的第二个视图控制器 (AdvancedViewController) 上,作为一个高级和更详细的部分等。我的价值试图通过的是“gmain”,正如您在下面的代码中看到的那样,它位于按钮函数内部,并且位于 viewDidLoad() 之外。
在我的 AdvancedViewController 代码中,我已经完成了它,因此我可以通过键入“vc”访问 ViewController 的内容。在从该 ViewController 输入变量之前,我可以访问标签、文本框、按钮等,但它无法识别“gmain”,您可以在我的代码底部看到,我正在尝试将“gmain”的值分配给我的AdvancedViewController 中的标签。如您所见,我的 AdvancedViewController 中的代码位于 viewDidLoad() 中,因为我希望在打开特定的 View Controller 时将其显示给用户。
如果我完全陷入困境,我将不胜感激,而且我已经坚持了好几天了。提前谢谢你。
我在下面的 ViewController 中的 JSON 结构:
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中的GoButton函数:
@IBAction func GoButton(_ sender: Any) {
let text: String = userValue.text!
guard let APIUrl = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=" + text + "&appid=***API***KEY***&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)
}
}
}
} catch {
print(error.localizedDescription)
}
}.resume()
AdvancedViewController 代码如下:
class AdvancedViewController: UIViewController {
@IBOutlet weak var Label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
let vc = ViewController(nibName: "ViewController", bundle: nil)
Label.text! = String (vc.gmain) //NOT WORKING <<
}
【问题讨论】:
-
你如何从
MainViewController到AdvancedViewController?看来您没有设置任何segue。我也没有看到任何push或present声明。 -
我会建议你先学习 OOP 的概念。
-
我只是在故事板上的 ViewController 中添加了一个按钮,然后 CTRL 将其拖到 AdvancedViewController,并选择了“显示”,因此一旦单击,它就会打开 AdvancedViewController
标签: ios json swift xcode viewcontroller