2013-10-27 26 views
23

現在の場所を取得しようとしていますが、didUpdateLocationsのブレークポイントは呼び出されません。didUpdateLocationsが呼び出されていません

LocationManager:

locationManager = [[CLLocationManager alloc] init]; 
[locationManager setDelegate:self]; 
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; 
[locationManager setDesiredAccuracy:kCLDistanceFilterNone]; 
[locationManager startUpdatingLocation]; 

デリゲートメソッド:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations; 

私はその場所のサービスを確認し、有効にして承認しました。

なぜ、locationManagerデリゲートメソッドが呼び出されないのですか?私はこの問題を抱えたとき

おかげで、 マイク

+0

は数分前に同じ問題を抱えていましたが、私は '[[CLLocationManager alloc] init];を実行していませんでした。ここで私を助ける[link](http://stackoverflow.com/questions/5374216/didupdatelocation-method-never-called)です – nupac

+0

この行を削除しようとします: '[locationManager setDesiredAccuracy:kCLDistanceFilterNone];' setDesiredAccuracyを設定すると2回、locationManagerをプロパティにする –

答えて

26

は、それはスレッドの問題によるものでした。

これらすべてのメソッドがメインスレッドで呼び出されていることを確認してください。 メインスレッドではstartUpdatingLocationメソッドが呼び出されるだけでなく、その他のメソッドも呼び出されることが非常に重要です。

あなたはまたthis answerをチェックアウト

dispatch_sync(dispatch_get_main_queue(), ^{ 

}); 

の内側にそれをラップすることにより、メインスレッド上で実行されるコードを強制することができます。

+0

私は上記と同じ問題を抱えていますが、私があなたのソリューションを使用するとき、私のボタンはその後はクリックできません。それは奇妙です。 – Dulax

+0

@Tim Bodeitおかげで...あなたの答えを保存してください。 –

+0

それを見落とさなければなりません...どのボタンについて話していますか? –

9

CLLocationManagerをプロパティとして追加したことを確認してください。はい、プロパティが有効になっているロケーションサービスをチェックするために私のためのソリューション、および優れたアイデアは

@property (nonatomic , strong) CLLocationManager *locationManager; 
+1

これは私の助けになります。そうでなければEXC_BAD_ACCESSエラーが発生しました。ありがとう:) – JakeP

5

た:

iOS8でさらに
if ([CLLocationManager locationServicesEnabled]) { 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.locationManager startUpdatingLocation]; 
} 
62

あなたは2つの余分なもの持っている必要があります。

  • Info.plistに鍵を追加し、ロケーションマネージャから許可を求めて、開始するよう依頼します。あなたは、対応する場所メソッドの許可を要求する必要があり

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

コード例:

self.locationManager = [[CLLocationManager alloc] init]; 
self.locationManager.delegate = self; 
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7. 
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
    [self.locationManager requestWhenInUseAuthorization]; 
} 
[self.locationManager startUpdatingLocation]; 

出典:http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

+1

私のための完璧な答え。 – benchuk

+1

私のために働かなかった。欠落しているものがいくつかあります。 [この回答](http://stackoverflow.com/a/26604933)が動作します。 –

+0

あなたが正しいことをするなら、これは完璧です。 – dreamBegin

2

シミュレートする場所をシミュレータに伝える必要があります。場所を指定しないと、CLLocationManagerデリゲートメソッドが呼び出されることはありません。シミュレータメニューの[Debug] - > [Location]を使用できます。また、デバッグ領域のXcodeには、Xcodeからアプリを実行するときに表示される小さな位置矢印があります。これを使ってモーションをシミュレートするGPXファイルを指定することもできます(実際のデバイスと同じではありません)。

https://devforums.apple.com/message/1073267#1073267

0

CLLocationManagerDelegateが設定されている場合は、MapViewの委任は

をも設定されている。また、シミュレータの場所を確認し、それが都市走行や高速道路に全く変化である場合シミュレーター>デバッグ>場所、 をクリックしますドライブ。それは私のために働いた。

関連する問題