ViewController.swiftファイルでtemperatureLabelを更新しようとしています。私は天気のクラスファイルから、それに値を代入するたびに、それがエラーを解決しますUILabelが予期せずnilを見つけたときに、クラスの外部から更新するときにオプション値をアンラップしました
"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!ありがとうございました!私はこれを前に試してみました。そして、それはちょうど打ち上げ画面にハングアップします。私のVCで天気予報のインスタンスを作成するViewControllerの新しいインスタンスを作成するので、私は確信していません。 –
あなたのviewDidLoadにself.temperatureLabel.delegate = selfを追加できますか? – Do2
タイプ 'UILabel'の値にメンバー '代理人'がありません –