CLLocationManager startUpdatingLocation с использованием UIButton - PullRequest
1 голос
/ 08 августа 2011

Я впервые использую CLLocationManager.Я не уверен, правильно ли я поступаю.Поправь меня, если я ошибаюсь.

Я инициализирую locationManager в моем viewDidLoad методе и сообщаю locationManager запускать UpdateLocation тем же методом.

Когда делегат получает

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{

    [locationManager stopUpdatingLocation];
    //do stuff with the coordinates
}

, чтобы избежать повторных вызовов этого метода делегата.

У меня есть UIButton, где пользователи могут щелкнуть, чтобы обновить местоположение

//called by user action
-(IBAction)updateLocation{
    //start updating delegate
    locationManager.delegate=self;
    [locationManager startUpdatingLocation];    
}

Однако, когда местоположение меняется и когда я нажимаю UIbutton, координаты местоположения не изменяются вообще,:(

Что я делаю не так? Это право делать или я вообще не должен останавливать locationManager?

Помощь будет принята с благодарностью.

Ответы [ 2 ]

10 голосов
/ 08 августа 2011

CLLocationManager кэширует ваше последнее местоположение и возвращает его, как только вы позвоните -startUpdatingLocation. Итак, вы запускаете обновления, получаете старое местоположение и затем останавливаете обновления.

Это не так, как -startUpdatingLocation/-stopUpdatingLocation предназначены для использования. Как я уже говорил выше, что не так с вызовом метода делегата несколько раз? Если вы хотите получить местоположение только тогда, когда пользователь нажимает кнопку, оставьте обновление CLLocationManager и просто отметьте свойство CLLocationManger location, когда пользователь нажимает вашу кнопку.

Если причина, по которой вы пытаетесь избежать нескольких вызовов метода делегата, заключается в том, что вы беспокоитесь о потреблении энергии и т. Д., Измените свойство desiredAccuracy CLLocationManager на что-то вроде: locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters.

В общем, это может выглядеть примерно так ...

.h файл:

@interface YourController : NSObject <CLLocationManagerDelegate>

@property (nonatomic, retain) CLLocationManager *locationMgr;
@property (nonatomic, retain) CLLocation *lastLocation;

- (IBAction)getNewLocation:(id)sender;

@end

.m файл:

@interface YourController

@synthesize locationMgr = _locationMgr;
@synthesize lastLocation = _lastLocation;

- (id)init
{
    if (self = [super init]) {
        self.locationMgr = [[CLLocationManager alloc] init];
        self.locationMgr.desiredAccuracy = kCLLocationAccuracyBest;
        self.locationMgr.delegate = self;
    }
    return self;
}

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
           fromLocation:(CLLocation *)oldLocation
{
    if (!self.lastLocation) {
        self.lastLocation = newLocation;        
    }

    if (newLocation.coordinate.latitude != self.lastLocation.coordinate.latitude &&
        newLocation.coordinate.longitude != self.lastLocation.coordinate.longitude) {        
        self.lastLocation = newLocation;
        NSLog(@"New location: %f, %f",
              self.lastLocation.coordinate.latitude,
              self.lastLocation.coordinate.longitude);
        [self.locationMgr stopUpdatingLocation];
    }
}

- (IBAction)getNewLocation:(id)sender
{
    [self.locationMgr startUpdatingLocation];
    NSLog(@"Old location: %f, %f", 
          self.lastLocation.coordinate.latitude, 
          self.lastLocation.coordinate.longitude);
}

- (void)dealloc
{
    [self.locationMgr release];
    self.locationMgr = nil;
    [self.lastLocation release];
    self.lastLocation = nil;
    [super dealloc];
}

@end
0 голосов
/ 08 августа 2011

Я предполагаю, что вы включили #import <CoreLocation/CoreLocation.h> framework в систему.Это способ начать получать обновления местоположения.

CLLocationManager *locationMgr = [[CLLocationManager alloc] init];
locationMgr.desiredAccuracy = kCLLocationAccuracyBest;
locationMgr.delegate = self;

[locationMgr startUpdatingLocation];

Вы правы здесь.После этого вы начинаете получать обновления местоположения, здесь, в этом делегате -

-(void)locationManager:(CLLocationManager *)manager
   didUpdateToLocation:(CLLocation *)newLocation
   fromLocation:(CLLocation *)oldLocation
{
    // Handle location updates
} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    // Handle error
}
...