13

これは、AppDelegateクラスにあるコードです。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    CLLocationManager *locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.distanceFilter = 1000;  // 1 Km
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    [locationManager startUpdatingLocation];
}

これは、AppDelegateクラスにあるデリゲートメソッドです。

    //This is the delegate method for CoreLocation
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{

        //printf("AppDelegate latitude %+.6f, longitude %+.6f\n", newLocation.coordinate.latitude, newLocation.coordinate.longitude);

}

3.0、3.1、3.1.3で動作しますが、4.0シミュレータとデバイスの両方では動作しません。

理由は何ですか ?

4

5 に答える 5

21

同様のエラーが発生し、解決しました。問題は、locationManager変数をローカルで宣言することです。代わりにクラス変数として宣言し、直接またはプロパティ保持を介して保持されることを確認します(またはARCを使用する場合は強力です)。それで問題は解決します!問題は、locationManager変数がリリースされ、デリゲートが更新されなかったことです。ここにコードがあります:

.hファイル:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>


@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> {
@private
    MKMapView *_mapView;
    CLLocationManager *_locationManager;
}

@property(nonatomic, strong) CLLocationManager *locationManager;

@end

.mファイル:

self.locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];

お役に立てば幸いです。

于 2012-05-23T02:18:46.237 に答える
2

あなた-locationManager:didFailWithError:の代理人に呼ばれることはありますか?考えているだけですが、ある時点で位置データへのアクセスを拒否し、プロンプトが表示されなくなった可能性がありますが、アクセスは拒否されています。

于 2010-06-17T05:40:08.167 に答える
2

CLLocationManagerを使用するいくつかのクラスの1つだけが、CLLocationManagerDelegateメソッドの 呼び出しを取得できない理由を理解しようと夢中になりました。

そのクラスは非メインスレッドから初期化されたため、そのCLLocationManagerは非メインスレッドで作成されました...一時的なスレッドである可能性もあります。とにかく、クラスを初期化するための呼び出しを以下でラップするだけで、CLLocationManagerデリゲートメソッドを呼び出すことができました。

dispatch_sync(dispatch_get_main_queue(), 
                    ^{
                         // create your class that will create a CLLocationManager here.
                     });

つまり、要点:メインスレッド以外にCLLocationManagerを作成しないでください。作成しないと、デリゲートメソッドが呼び出されなくなります。私はかつてこれを知っていました...ちょうど長い間...ため息をつきました。これをもう一度理解するために1日を無駄にしました!私が読んだすべてのCLLocationManagerSOはこれを取り上げなかったので、ここに投稿します。それが誰かを助けることを願っています!

于 2019-03-11T19:21:10.903 に答える
0

ロケーションマネージャーの割り当てをどこかで解除していませんか?あなたが持っているコードは、didFinishLaunching ...メソッドで割り当てられているが、忘れられていることを示しています(ただし、まだ保持されているため、機能するはずです)。

ユーザーの場所を取得してもよいかどうかを尋ねる最初のポップアップも表示されますか?

于 2010-06-17T05:05:43.657 に答える
0

「navigationControllerにプッシュされる」viewControllerにコードを配置します。

私のコードはです。

SomeViewController.hで

#import <MapKit/MapKit.h>
@interface SomeViewController : UIViewController<CLLocationManagerDelegate>{
}
@property (nonatomic, strong) CLLocationManager *locationManager;
@end

SomeViewController.mで

#import "SomeViewController.h"

@implementation SomeViewController


-(void)findLocation{
    if ([CLLocationManager locationServicesEnabled]) {
        if (!self.locationManager) {
            self.locationManager = [[CLLocationManager alloc] init];
            self.locationManager.delegate = self;
            self.locationManager.distanceFilter = kCLDistanceFilterNone;
            self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
            [self.locationManager startUpdatingLocation];
        }
    }
}
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{
    NSLog(@"didUpdateLocations");

    CLLocation *lo = [locations objectAtIndex:0];
    NSLog(@"latitude = %f, longitude = %f", lo.coordinate.latitude, lo.coordinate.longitude);

    [manager stopUpdatingHeading];
}
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
    NSLog(@"didUpdateToLocation");}
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
    NSLog(@"didFailWithError");
    [manager stopUpdatingLocation];
}

私が思う問題はARCのせいで、locationManagerがリリースされています。

于 2013-09-11T01:46:48.583 に答える