3

非常に奇妙なエラーで立ち往生しているため、私はあなたに手紙を書いています。アプリに GMS を追加しようとしましたが、最後に、デバイスの場所を取得する必要があるときに、次のクラッシュが発生しました。

キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。現在の観測情報: (コンテキスト: 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;
}

そして成功しません。

誰でもこれで私を助けることができますか? 考えられるすべての解決策を試しましたが、できませんでした。

前もって感謝します!

4

2 に答える 2

2

コメントですでに述べた方法.. GMSMapView は次のようにする必要がStrong ありますrequestWhenInUseAuthorization

KVO の代わりに CLLocationManager のみを使用することをお勧めしますが、それはあなたの判断です。

私の例を添付しました- 私はGoogleの例を修正しました... 2つの例で:

  1. KVO付き
  2. CLLocationManager のみ

問題がある場合は...お知らせください

PS APIキーを追加することを忘れないでください

ハッピーコーディング!

アップデート

StartUpdatingLocation ..どこかで停止することを忘れないでください.. stopUpdatingLocationViewDidDisapearで言ってみましょう

于 2014-11-29T22:05:24.837 に答える
2

viewWillAppear :内に登録する場合は、 viewWillDisappearを使用してオブザーバーを削除します。

viewDidLoad内で登録する場合は、 deinitを使用してオブザーバーの登録を解除します。常にカウンター部分を使用して登録および登録解除します。それで問題ありません

スイフト3

deinit {
     mapView.removeObserver(self, forKeyPath: "myLocation")
}
于 2016-10-08T10:51:10.603 に答える