首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正在尝试从我的主ViewController调用一个函数,并使用它在我的第二个ViewController中加载JSON数据

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

Stack Overflow用户
提问于 2018-08-16 07:14:28
回答 1查看 51关注 0票数 0

我正在为iOS制作一个天气应用程序,我正在尝试从我的主ViewController调用一个变量,以便在我的第二个ViewController中使用,我正在使用来自OpenWeatherMap的API数据来显示天气数据,这在主ViewController上工作得很好,我希望它显示在第二个ViewController上,作为一个‘高级详细信息’部分,它将显示最高/最低温度和气压等(人们并不关心的东西)。

我已经创建了我的主Viewcontroller 'var myCustomViewController: weatherData= ViewController (nibName: nil,bundle: nil)‘的一个实例,它工作得很好,并且我能够从主视图控制器调用标签、变量、TextBoxes等,但我不能调用变量'weatherData',它是我的JSON数据的解码器。

在我的第二个视图控制器中,我想说‘如果让gmain = (myCustomViewController.weatherData.main.tempmax’来获取最高温度,但它不能识别'weatherData‘。我在这件事上被困住了,非常感谢任何人的帮助。谢谢。

下面是我的主ViewController中的结构:

代码语言:javascript
运行
复制
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代码如下:

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
    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)
                    }
                }
            }

    }
EN

回答 1

Stack Overflow用户

发布于 2018-08-16 07:53:13

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

代码语言:javascript
运行
复制
let weatherData = try decoder.decode(MyWeather.self, from: data)

这是在像viewDidLoad这样的方法中实现的吗?如果是这样,那么weatherData不是MainViewController的属性,并且不能被子类访问。你必须将它定义为任何函数作用域之外的属性(例如,在文件的顶部,紧跟在左方括号之后):

代码语言:javascript
运行
复制
var weatherData = ...

然后这样叫它:

代码语言:javascript
运行
复制
do {
    weatherData = ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51867659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档