出乎意料地发现没有,但我可以打印值

时间:2017-12-14 00:13:03

标签: ios json swift null

编辑:添加一些更相关的细节。

因此,对于我的应用,我希望有三个页面显示不同的天气信息。我可以水平滚动查看它们。我按照这个youtube视频和Github项目进行参考。

https://www.youtube.com/watch?v=1_daE3IL_1s https://github.com/ibrdrahim/slidePage

我所做的是在主故事板中添加滚动视图。然后我用xib创建了三个Cocoa Touch类。它们中的每一个都是UIViewController的子类。每个xib将在滚动视图中充当页面。

这是我用于设置xib视图的代码。

let xOrigin = self.view.frame.width

let credit : CreditScreenView = CreditScreenView(nibName: "CreditScreenView", bundle: nil)

mainScroll.addSubview(credit.view)

let forcast : ForcastScreenView = ForcastScreenView(nibName: "ForcastScreenView", bundle: nil)

mainScroll.addSubview(forcast.view)

let now : NowScreenView = NowScreenView(nibName: "NowScreenView", bundle: nil)

mainScroll.addSubview(now.view)

// set up the size for each view
credit.view.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: self.view.frame.height)

forcast.view.frame = CGRect(x: xOrigin, y: 0, width: self.view.frame.width, height: self.view.frame.height)

now.view.frame = CGRect(x: xOrigin * 2, y: 0, width: self.view.frame.width, height: self.view.frame.height)

mainScroll.contentSize = CGSize(width: CGFloat(view.frame.width * 3), height: CGFloat(view.frame.height))
mainScroll.contentOffset.x = view.frame.width * 3

enter image description here

这是NowScreenView上的所有连接插座。

在应用程序获取JSON后调用updateWeatherData。

func  getWeatherData(url: String, parameters: [String : String]) {

    Alamofire.request(url, method: .get, parameters: parameters).responseJSON {
        response in
        if response.result.isSuccess {
            print("Success! Got the weather data")

            let weatherJSON : JSON = JSON(response.result.value!)

            print(weatherJSON)

            self.updateWeatherData(json: weatherJSON)
        }
        else {
            print("Error \(String(describing: response.result.error))")
            self.cityLabel.text = "链\n接\n不\n可\n用"
        }
    }
}

我正在做我的第一个iOS应用程序。这是一个天气应用程序。我有一个致命的错误,我不明白为什么。我想要做的是将我从JSON文件获得的位置数据分配给屏幕上的cityLabel。所以它显示了城市名称。 现在我可以用JSON打印位置数据的值,但如果我想将它分配给标签,它将给我致命的错误。

func updateWeatherData(json : JSON) {
    let data = json["HeWeather6"][0]
    let status = data["status"].stringValue
    //print(json)
    if status == "ok" {
        let tmpsNow = data["now"]["tmp"].intValue

        weatherDataModel.temperature = tmpsNow
        weatherDataModel.city = data["basic"]["location"].stringValue
        weatherDataModel.condition = data["now"]["cond_code"].intValue            
        weatherDataModel.weatherIconName = weatherDataModel.updateWeatherIcon(condition: weatherDataModel.condition)

        updateUIWithWeatherData()
    } else {
        cityLabel.text = "天\n气\n不\n可\n用"
    }   
}

这是我从JSON获取数据的方式。还有另一个weatherDataModel.swift来排序JSON数据。

func updateUIWithWeatherData() {
    cityLabel.text = "\(weatherDataModel.city)"
    nowTemp.text = "\(weatherDataModel.temperature)º"
    weatherIcon.image = UIImage(named: weatherDataModel.weatherIconName)!
}

这是我获取天气数据后更新UI的方式。

我在这一行得到致命错误

cityLabel.text = "\(weatherDataModel.city)"

enter image description here

我尝试print(weatherDataModel.city),它会打印城市名称,没有错误。但我无法将值分配给cityLabel。有人可以帮我弄清问题是什么?谢谢!

如果有人想查看完整代码,这是GitHub链接。 https://github.com/lucky13820/air

2 个答案:

答案 0 :(得分:2)

我刚刚编译了你的代码,问题与你的模型无关,问题在于你的 ViewController.swift 类,首先你要用这种方式用nib文件创建视图。

NowScreenView(nibName: "NowScreenView", bundle: nil)

错误你正在做这一点,就像这样创建类级变量。这是完全错误的。

let nowWeather = NowScreenView()

NowScreenView 不是共享类,它的简单视图类通过这样做你无法获得你的NowScreenView的引用,这就是为什么你得到nil标签,真正的方式来获取 NowScreenView的引用

nowWeather  = NowScreenView(nibName: "NowScreenView", bundle: nil)

现在 nowWeather 引用了您的视图,您可以访问您的视图数据成员。

答案 1 :(得分:-2)

尝试将.stringValue添加到weatherDataModel.temperature = tmpsNow的末尾,因为您似乎试图在标签中放入一个int值。如果这有帮助,请告诉我。