编辑:添加一些更相关的细节。
因此,对于我的应用,我希望有三个页面显示不同的天气信息。我可以水平滚动查看它们。我按照这个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
这是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)"
我尝试print(weatherDataModel.city)
,它会打印城市名称,没有错误。但我无法将值分配给cityLabel。有人可以帮我弄清问题是什么?谢谢!
如果有人想查看完整代码,这是GitHub链接。 https://github.com/lucky13820/air
答案 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值。如果这有帮助,请告诉我。