2016-09-30 58 views
0

我試圖更新我的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{ 
      _ = "" 
     } 
    } 
} 

} 

回答

0

添加到您的viewDidLoad

self.temperatureLabel.text=Weather.getWeatherFromAPI() 

,並在您的天氣類中刪除:

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

的另一件事你應該做的是做功能etWeatherFromAPI()返回一個字符串

+0

謝謝repsonse!我以前嘗試過,它只是掛在啓動屏幕上。林不知道是否因爲它創建一個ViewController的新實例,在我的VC創建一個天氣的實例,似乎只是不斷循環通過相同的結果? –

+0

你可以在你的viewDidLoad中添加self.temperatureLabel.delegate = self – Do2

+0

'UILabel'類型的值沒有成員'delegate' –

0

嘗試

var mainVC: ViewController = ViewController() 
+0

感謝repsonse!我以前嘗試過,它只是掛在啓動屏幕上。林不知道是否因爲它創建一個ViewController的新實例,在我的VC創建一個天氣的實例,似乎只是不斷循環通過相同的結果? –

+0

您是否已將ViewController的實例傳遞給Weather實例? –

+0

儘管此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 –

0

您應該的ViewController當前實例分配mainVC

class ViewController... { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     ... 
     self.currentLocation.mainVC = self 
    } 
} 
相關問題