簡體   English   中英

在iPhone上的GoogleMaps上獲取我的位置時崩潰

[英]Crash while getting my location on GoogleMaps on iPhone

我寫信給你是因為我遇到了一個非常奇怪的錯誤。 我試圖在我的應用程序上添加GMS,最后,當我必須獲取設備位置時,我遇到了這個崩潰:

由於未捕獲的異常'NSInternalInconsistencyException'而終止應用程序,原因:'GMSMapView類的實例0x7ff7fd82def0已取消分配,而鍵值觀察者仍在其中注冊。 當前觀察信息:(上下文:0x0,屬性:0x7ff7fdc2f470>

代碼在這里初始化:

self.mapView.myLocationEnabled = YES;
self.mapView.mapType = kGMSTypeNormal;
self.mapView.settings.compassButton = YES;
self.mapView.settings.myLocationButton = YES;

//=>    Listen to the myLocation property of GMSMapView.
[self.mapView addObserver:self
               forKeyPath:@"myLocation"
                  options:NSKeyValueObservingOptionNew
                  context:NULL];


- (void)observeValueForKeyPath:(NSString *)keyPath
                  ofObject:(id)object
                    change:(NSDictionary *)change
                   context:(void *)context
{
if ([keyPath isEqualToString:@"myLocation"] && [object isKindOfClass:[GMSMapView class]])
{   
    appDelegate().curUserLocation = [change objectForKey:NSKeyValueChangeNewKey];

    [self.mapView animateToCameraPosition:[GMSCameraPosition cameraWithLatitude:self.mapView.myLocation.coordinate.latitude
                                                                             longitude:self.mapView.myLocation.coordinate.longitude
                                                                                  zoom:15]];
}
}

但仍然沒有成功。 我把斷點放在observerValueForKey方法中,一旦從這里出來,就會出現崩潰。 無法得到這個想法。

我也刪除了觀察者:

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];

[self.mapView removeObserver:self forKeyPath:@"myLocation"];

//=>    Set map delegate to nil (to avoid:   mapView:regionDidChangeAnimated:]: message sent to deallocated instance )
self.mapView.delegate = nil;
self.mapView = nil;
}

並沒有成功。

誰能幫我這個 ? 我嘗試了所有可能的解決方案,但沒辦法。

提前致謝!

已經在評論中說過了...... GMSMapView必須很Strong如果你沒有調用requestWhenInUseAuthorization你的代碼將無法在iOS 8中requestWhenInUseAuthorization

我建議你只使用CLLocationManager代替KVO ...但是你的決定。

附上我的例子 - 我用2個示例修改了Google示例...

  1. 與KVO
  2. 僅限CLLocationManager

如果您有任何問題......請告訴我

PS別忘了添加API密鑰

快樂的編碼!

UPDATE

如果你startUpdatingLocation ..不要忘記用stopUpdatingLocation停止它..讓我們說在ViewDidDisapear

如果在viewWillAppear :中注冊,請使用viewWillDisappear刪除觀察者。

如果在viewDidLoad中注冊,請使用deinit取消注冊觀察者。 始終使用計數器部件進行注冊和取消注冊,這應該沒問題

斯威夫特3

deinit {
     mapView.removeObserver(self, forKeyPath: "myLocation")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM