2017-05-05 39 views
0

我正在嘗試將樣式化的Google地圖集成到我在Swift中編程的iOS應用程序中。我在我的故事板中有一個GMSMapView的視圖,並且正在嘗試使用自定義JSON對它進行着色。下面是製作的MapView代碼:我嘗試設置我的地圖視圖時崩潰了我的應用程序

@IBOutlet weak var mapView: GMSMapView! 

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let userLocation = locations.last 
    //let center = CLLocationCoordinate2D(latitude: userLocation!.coordinate.latitude, longitude: userLocation!.coordinate.longitude) 

    let camera = GMSCameraPosition.camera(withLatitude: userLocation!.coordinate.latitude, 
              longitude: userLocation!.coordinate.longitude, zoom: 13.0) 

    mapView.isMyLocationEnabled = true 
    mapView.camera = camera 
    self.view = mapView 

    locationManager.stopUpdatingLocation() 
} 

override func loadView() { 
    do { 
     // Set the map style by passing the URL of the local file. 
     if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") { 
***error->   self.mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL) 
     } else { 
      NSLog("Unable to find style.json") 
     } 
    } catch { 
     NSLog("One or more of the map styles failed to load. \(error)") 
    } 
} 

但是當我嘗試運行它,我得到一個致命錯誤

意外發現零而展開的可選值

引發錯誤的行是其上的***。我已將GMSMapView與故事板上的視圖鏈接起來,並且該應用程序可以正確編譯,而不會試圖對其進行設置。有誰知道爲什麼會出現這個錯誤?我搜索了錯誤,但無法找到與我的代碼相關的任何內容,而且我無法理解某些鏈接希望我做什麼。

回答

1

錯誤是因爲self.mapViewnil。原因如下:

您的地圖視圖設置爲您的故事板的出口。在這種情況下,您的地圖視圖將爲您創建。只要確保地圖視圖實際連接到插座。

真正的問題是您已經重載了loadView方法。不要這樣做。從UIViewController loadView的文檔:

如果使用Interface Builder創建視圖並初始化視圖控制器,則不得重寫此方法。

您目前在loadView中的代碼應移至viewDidLoad方法。

override func viewDidLoad() { 
    super.viewDidLoad() 

    do { 
     // Set the map style by passing the URL of the local file. 
     if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") { 
      self.mapView.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL) 
     } else { 
      NSLog("Unable to find style.json") 
     } 
    } catch { 
     NSLog("One or more of the map styles failed to load. \(error)") 
    } 

    // and any other code you might need in viewDidLoad 
} 

下一個大問題是,你的值賦給self.view位置管理委託裏面。那也不好。只有在您以編程方式創建整個視圖控制器及其視圖時,您唯一應該在視圖控制器中指定self.view的地方是loadView

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    let userLocation = locations.last 
    //let center = CLLocationCoordinate2D(latitude: userLocation!.coordinate.latitude, longitude: userLocation!.coordinate.longitude) 

    let camera = GMSCameraPosition.camera(withLatitude: userLocation!.coordinate.latitude, 
              longitude: userLocation!.coordinate.longitude, zoom: 13.0) 

    mapView.isMyLocationEnabled = true 
    mapView.camera = camera 

    locationManager.stopUpdatingLocation() 
} 

總結:

  1. 卸下loadView方法。將其內容移至viewDidLoad
  2. 請勿將代碼分配給self.view任何位置。
  3. 確保故事板中的地圖視圖確實連接到了您的插座。
+0

工作就像一個魅力。非常感謝!!! – Alan

相關問題