2017-06-10 63 views
0

所以我得到了下面的函數來設置我的地圖區域我的應用程序:爲什麼我的MKCoordinateRegion零?

func mapRegion() -> MKCoordinateRegion { 

    databaseHandle = databaseRef.child("RunList").child(runName).observe(.value, with: { (snapshot) in 

     let runData = snapshot.value as? [String: AnyObject] 
     self.minLat = runData?["startLat"] as? Double 
     self.minLng = runData?["startLong"] as? Double 
     self.maxLat = runData?["endLat"] as? Double 
     self.maxLng = runData?["endLong"] as? Double 
     print("testing") 
     print(self.minLat!) 
     print(self.maxLng!) 

     self.coordinate = MKCoordinateRegion(
      center: CLLocationCoordinate2D(latitude: (self.minLat! + self.maxLat!)/2, 
              longitude: (self.minLng! + self.maxLng!)/2), 
      span: MKCoordinateSpan(latitudeDelta: (self.maxLat! - self.minLat!)*1.1, 
            longitudeDelta: (self.maxLng! - self.minLng!)*1.1)) 

    }) 

    return coordinate 

} 

我已經初始化以下變量在我班上的第一名:

var minLat: Double! 
var minLng: Double! 
var maxLat: Double! 
var maxLng: Double! 
var coordinate: MKCoordinateRegion! 

,我試圖設置地圖區域如下:

override func viewDidLoad() { 
    super.viewDidLoad() 
    configureView() 
    mapView.region = mapRegion() 
} 

我得到的錯誤是在我設置我的座標區域的代碼塊下的行ns我的databaseHandle在mapRegion()中。當代碼運行時,我得到的線下下面的錯誤「迴歸座標爲:

fatal error: unexpectedly found nil while unwrapping an Optional value 

據我瞭解,這是發生因爲「座標」沒有值,是可選的。爲什麼即使我使用全局變量進行設置,座標也沒有值?我覺得我錯過了這麼簡單的事情!

感謝

+1

*我已經在我的課程頂部初始化了以下變量*。不,你沒有。您已**將變量聲明爲隱式解包選項。他們沒有初始值,因此他們是'零',並可能導致崩潰。 – vadian

+0

問題是'返回座標'將在你初始化之前調用它發生,因爲'observe'的完成塊將在你得到響應時調用異步,所以你需要的是用'mapRegion'方法創建完成塊。 –

回答

0

您的代碼不起作用,因爲observe以異步方式工作,這是不可能從包含的異步任務的方法返回一個值。

你需要完成處理

func mapRegion(completion: (MKCoordinateRegion)->()) { 

    databaseHandle = databaseRef.child("RunList").child(runName).observe(.value, with: { (snapshot) in 

     let runData = snapshot.value as? [String: AnyObject] 
     self.minLat = runData?["startLat"] as? Double 
     self.minLng = runData?["startLong"] as? Double 
     self.maxLat = runData?["endLat"] as? Double 
     self.maxLng = runData?["endLong"] as? Double 
     print("testing") 
     print(self.minLat!) 
     print(self.maxLng!) 

     let region = MKCoordinateRegion(
      center: CLLocationCoordinate2D(latitude: (self.minLat! + self.maxLat!)/2, 
              longitude: (self.minLng! + self.maxLng!)/2), 
      span: MKCoordinateSpan(latitudeDelta: (self.maxLat! - self.minLat!)*1.1, 
            longitudeDelta: (self.maxLng! - self.minLng!)*1.1)) 
     completion(region) 

    }) 
} 

而且使用它

mapRegion() { region in 
    mapView.region = region 
    // do other things with the region 
} 

旁註:

有在代碼中太多的問號。使用可選的綁定來安全地打開選項。

+0

生病給它一拍 – Mr10k

+0

試過它沒有運氣,相同的錯誤.... 我試着搬出觀察功能到一個不同的方法,並只是在mapRegion()返回MKCoordinateRegion,仍然是同樣的問題。我可能會嘗試以不同的方式設置地圖區域。 – Mr10k

+0

如果您完全按照答案中的描述使用該方法,則該代碼必須正常工作。當然,你必須把所有依賴於接收區域的代碼放到'mapRegion()'的完成處理程序中。請學習瞭解異步網絡。 – vadian