4

考えられるすべての解決策を検索しましたが、正確な解決策を見つけることができませんでした。私の問題は次のとおりです。GMSMapViewでナビゲーションコントローラーとビューコントローラーを使用しています。GMSMapView から他のビューに移動すると、「キー値オブザーバーがまだ登録されている間に、クラス GMSMapView のインスタンス 0x7f9b79c53c20 の割り当てが解除されました」という例外が発生してアプリがクラッシュします。

しかし、viewwilldisappear または deinit でオブザーバーを削除しようとすると、「オブザーバーとして登録されていないため、キー パス "myLocation" のオブザーバーを削除できません」という例外でアプリが再びクラッシュします。

誰でも最善の解決策を手伝ってもらえますか。これが私のコードです:

override func viewDidLoad() {

open.target = self.revealViewController()
open.action = "revealToggle:"
self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

locationManager.delegate = self
mapView.delegate = self

if (locationManager.respondsToSelector(Selector("requestWhenInUseAuthorization"))) {
locationManager.requestWhenInUseAuthorization()
}
 mapView.myLocationEnabled = true

placesClient = GMSPlacesClient()  
}

override func viewWillAppear(animated: Bool) {

    mapView.addObserver(self, forKeyPath: "myLocation", options: NSKeyValueObservingOptions.New, context: nil)

}

deinit{
removeObserver(self, forKeyPath: "myLocation", context: nil)

}
 override func viewWillDisappear(animated: Bool) {


   // removeObserver(self, forKeyPath: "myLocation")
}

 override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
    if !didFindMyLocation {
        let myLocation: CLLocation = change[NSKeyValueChangeNewKey] as CLLocation
        mapView.camera = GMSCameraPosition.cameraWithTarget(myLocation.coordinate, zoom: 15.0)
        mapView.settings.myLocationButton = true
        didFindMyLocation = true
    }
}
4

2 に答える 2