我試圖更新我的ViewController.swift文件中的temperatureLabel。每當我從我的天氣類文件值分配給它,它解決了錯誤:UILabel意外地發現零,而從類外部更新時展開可選值
"fatal error: unexpectedly found nil while unwrapping an Optional value".
不過,如果我給它分配在ViewController.swift文件viewDidLoad中的值,標籤更新的罰款。請幫忙!
class Weather{
var city = ""
var lat = ""
var long = ""
var currentTemp = 0
var currentCondition: String?
var dayOneName: String?
var dayTwoName: String?
var dayThreeName: String?
var dayOneCondition: String?
var dayTwoCondition: String?
var dayThreeCondition: String?
var mainVC: ViewController!
func getWeatherFromAPI(){
let urlString = "https://api.forecast.io/forecast/<removed key>/(\self.lat),\(self.long)"
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!, completionHandler: {(data, response, error) in
if error != nil {
print(error)
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject]
let currentConditions = parsedData["currently"] as! [String:Any]
let temp = currentConditions["temperature"] as! Int!
self.currentTemp = temp!
print(self.currentTemp)//returns expected value
self.mainVC.temperatureLabel.text = "\(self.currentTemp)" //fatal error: unexpectedly found nil while unwrapping an Optional value
} catch let error as NSError {
print(error)
}
}
}).resume()
}//end of getWeatherFromAPI
}
這裏是ViewController.swift
class ViewController: UIViewController, CLLocationManagerDelegate {
@IBOutlet weak var conditionImage: UIImageView!
@IBOutlet weak var mainConditionLabel: UILabel!
@IBOutlet weak var mainCityLabel: UILabel!
@IBOutlet weak var temperatureLabel: UILabel!
@IBOutlet weak var dayOneLabel: UILabel!
@IBOutlet weak var dayTwoLabel: UILabel!
@IBOutlet weak var dayThreeLabel: UILabel!
@IBOutlet weak var dayOneConditionImage: UIImageView!
@IBOutlet weak var dayTwoConditionImage: UIImageView!
@IBOutlet weak var dayThreeConditionImage: UIImageView!
let locationManager = CLLocationManager()
var currentLocation = Weather()
override func viewDidLoad() {
super.viewDidLoad()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
CLGeocoder().reverseGeocodeLocation(manager.location!, completionHandler: {(placemarks, error)->Void in
if (error != nil){
self.locationManager.stopUpdatingLocation()
print("Reverse geocoder failed with error" + (error?.localizedDescription)!)
return
}
if (placemarks?.count)! > 0{
let pm = (placemarks?[0])! as CLPlacemark
self.locationInfo(placemark: pm)
}
else{
print("Problem with the data received from geocoder")
}
})
}
func locationInfo(placemark: CLPlacemark?){
if let containsPlacemark = placemark{
//stop updating location to save battery life
//locationManager.stopUpdatingLocation()
if containsPlacemark.locality != nil{
let locality = containsPlacemark.locality
let location = self.locationManager.location
let lat = String(describing: location!.coordinate.latitude)
let long = String(describing: location! .coordinate.latitude)
self.currentLocation.city = locality!
self.currentLocation.lat = lat
self.currentLocation.long = long
self.currentLocation.getWeatherFromAPI()
}
else{
_ = ""
}
}
}
}
謝謝repsonse!我以前嘗試過,它只是掛在啓動屏幕上。林不知道是否因爲它創建一個ViewController的新實例,在我的VC創建一個天氣的實例,似乎只是不斷循環通過相同的結果? –
你可以在你的viewDidLoad中添加self.temperatureLabel.delegate = self – Do2
'UILabel'類型的值沒有成員'delegate' –