我正在尝试从我的主 ViewController 调用一个函数并使用它在我的第二个 ViewController 中加载 JSON 数据

Posted

技术标签:

【中文标题】我正在尝试从我的主 ViewController 调用一个函数并使用它在我的第二个 ViewController 中加载 JSON 数据【英文标题】:I am trying to call a function from my main ViewController and use it to load JSON data in my Second ViewController 【发布时间】:2018-08-15 23:14:27 【问题描述】:

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

我已经创建了一个我的 Main ViewController 'var myCustomViewController: ViewController = ViewController (nibName: nil, bundle: nil)' 的实例,它工作正常,我可以从 Main Viewcontroller 调用标签、变量、文本框等,但我不能调用变量“weatherData”,它是我的 JSON 数据的解码器。

在我的第二个视图控制器中,我想说'if let gmain = (myCustomViewController.weatherData.main.tempmax' 例如,以获得最高温度,但它不识别'weatherData'。我很卡住对此,我们将不胜感激。谢谢。

下面我的主视图控制器中的结构:

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?

下面的主视图控制器代码:

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)
                    
                
            

    

【问题讨论】:

【参考方案1】:

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

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

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

var weatherData = ...

然后这样称呼它:

do 
    weatherData = ...

【讨论】:

它在 viewDidLoad 之外,就在它的右括号下方,它在按钮按下函数中定义。我仍然找不到调用它的方法

以上是关于我正在尝试从我的主 ViewController 调用一个函数并使用它在我的第二个 ViewController 中加载 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

ViewController 正在加载一个不存在的笔尖

将 managedObjectContext 发送到 viewController 崩溃

在新库 ViewController 上方添加 UIButton

如何从我的主视图控制器访问 UIView 中的 let 语句?

如何从我的应用程序委托启动一个 NSTimer,它在 Viewcontroller.m 中调用我的方法

Qt 从我的主窗口创建新窗口