1

iPhone で現在の位置を取得し、その座標をいくつかの関数呼び出しに使用したいと考えています。

今、座標にアクセスしたいときに、それらが空であるという問題があります。しかし、デリゲート関数では、それらは何らかの形で取得されますが、保存されません...

の NSLog にdoLocationは値が表示されませんがlocationmanager、NSLog に表示されます。または、これは NSLog の問題でしょうか?

#pragma mark - Location handling

-(CLLocationCoordinate2D)doLocation {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    self.locationManager.distanceFilter = 50;
    [self.locationManager startUpdatingLocation];

    CLLocation *location = [self.locationManager location];
    CLLocationCoordinate2D coordinate = [location coordinate];

    NSLog(@"debug: coordinates: %@", coordinate); 

    return coordinate; 
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    if (!oldLocation ||
        (oldLocation.coordinate.latitude != newLocation.coordinate.latitude &&
         oldLocation.coordinate.longitude != newLocation.coordinate.longitude)) {

            currentLat = newLocation.coordinate.latitude;
            currentLng = newLocation.coordinate.longitude;


        } else { // oldLocation
            currentLat = oldLocation.coordinate.latitude;
            currentLng = oldLocation.coordinate.longitude;
        }

    self.currentLoc = [[CLLocation alloc] initWithLatitude:currentLat longitude:currentLng];

    NSLog(@"debug: self.currentLoc: %@", self.currentLoc);

}

- (void)locationManager:(CLLocationManager *)manager
       didFailWithError:(NSError *)error {
    NSLog(@"%@", error);
}

デバッグアウトは次のとおりです。

2013-07-01 15:59:29.382 foobar[3793:c07] デバッグ: 座標: (null) -doLocation 1: 現在の場所:

2013-07-01 15:59:35.399 foobar[3793:c07] デバッグ: self.currentLoc: <+51.50998000,-0.13370000> +/- 0.00m (速度 -1.00 mps / コース -1.00) @ 7/1/13 、午後 3 時 59 分 35 秒中央ヨーロッパ夏時間

4

2 に答える 2

1

デリゲートが起動したときに位置を取得するだけなので、この時点で座標を取得し、変数に格納してデリゲートを作成し、新しい座標を選択することをオブジェクトに伝えることができます。デザイン パターンを使用して、このクラス (場所) を作成します。

サンプル: .h

#import <CoreLocation/CoreLocation.h>

@protocol LocationDelegate <NSObject>

@optional
-(void)didUpdateLocation;
-(void)statusChanged;
@end
@interface Location : CLLocationManager <CLLocationManagerDelegate>
{
    BOOL wantUpdate;
}
@property(strong, nonatomic) CLLocationManager *lm;
@property(strong, nonatomic) NSString *latitude;
@property(strong, nonatomic) NSString *longitude;
@property(assign,nonatomic) id delegate;
@property(assign,nonatomic) id delegateStatus;

+(id)shared;
-(void)start;
-(void)update;
@end

.m

+ (id)shared {
    static Location *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

-(id)init
{
    self = [super init];

    if(self){
        lm = [[CLLocationManager alloc]init];
        lm.delegate = self;
        lm.purpose = @"Your purpose";
        lm.desiredAccuracy = kCLLocationAccuracyBest;
        wantUpdate = NO;
        delegate = self;
        delegateStatus = self;
    }
        return self;
    }

    -(void)start
    {
        wantUpdate = YES;
        [lm startUpdatingLocation];
    }

    -(void)update
    {
        [lm startUpdatingLocation];
    }

    -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
    {
        if(wantUpdate)
        {
            latitude = [NSString stringWithFormat:@"%f",newLocation.coordinate.latitude];
            longitude = [NSString stringWithFormat:@"%f",newLocation.coordinate.longitude];

            [lm stopUpdatingLocation];
            [delegate didUpdateLocation];
        }

        [lm stopUpdatingLocation];
        wantUpdate = NO;
    }

    -(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
    {
        NSLog(@"Error while location  %@",error);
    }

    -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
    {
        if(status == kCLAuthorizationStatusAuthorized)
        {
            if([delegateStatus respondsToSelector:@selector(statusChanged)])
                [delegateStatus statusChanged];
        }
    }
于 2013-07-01T19:22:34.237 に答える