2016-09-30 7 views
0

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{ 
      _ = "" 
     } 
    } 
} 

} 

答えて

0

で削除あなたのviewDidLoad

self.temperatureLabel.text=Weather.getWeatherFromAPI() 

にして、気象クラスでこれを追加します。

self.mainVC.temperatureLabel.text = "\(self.currentTemp)" 

他の事をあなたはすべきことはfuncを作ることですあなたがViewControllerの現在のインスタンスにmainVCを割り当てる必要があります

var mainVC: ViewController = ViewController() 
+0

repsonse!ありがとうございました!私はこれを前に試してみました。そして、それはちょうど打ち上げ画面にハングアップします。私のVCで天気予報のインスタンスを作成するViewControllerの新しいインスタンスを作成するので、私は確信していません。 –

+0

あなたのviewDidLoadにself.temperatureLabel.delegate = selfを追加できますか? – Do2

+0

タイプ 'UILabel'の値にメンバー '代理人'がありません –

0

を返すようにetWeatherFromAPI()。

class ViewController... { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     ... 
     self.currentLocation.mainVC = self 
    } 
} 
+0

repsonseありがとう!私はこれを前に試してみました。そして、それはちょうど打ち上げ画面にハングアップします。私のVCで天気予報のインスタンスを作成するViewControllerの新しいインスタンスを作成するので、私は確信していません。 –

+0

ViewControllerのインスタンスをWeatherインスタンスに渡しましたか? –

+0

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 –

0

を試してみて、文字列

関連する問題