Получение долготы / широты пользователя, когда viewDidLoad - PullRequest
12 голосов
/ 16 мая 2011

Моя цель - получить долготу / широту пользователя при загрузке представления и сохранить значения в двух переменных для последующих вычислений.Мне не нужно отслеживать местоположение пользователя и обновлять его, мне просто нужно получить его / ее координаты один раз .Мой код выглядит так:

- (void)viewDidLoad {
    [super viewDidLoad];
    // locationManager update as location
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];
    CLLocation *location = [locationManager location];
    // Configure the new event with information from the location
    CLLocationCoordinate2D coordinate = [location coordinate];

    float longitude=coordinate.longitude;
    float latitude=coordinate.latitude;

    NSLog(@"dLongitude : %f",longitude);
    NSLog(@"dLatitude : %f", latitude); 
}

В консоли я продолжаю получать это:

dLongitude : 0.000000
dLatitude : 0.000000

Не могли бы вы мне помочь?

Ответы [ 5 ]

7 голосов
/ 16 мая 2011

Как только вы вызовете [locationManager startUpdatingLocation];, ваш метод viewDidLoad завершится. Вам необходимо реализовать

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

и

- (void) locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error

, который будет вызываться вашим LocationManager, когда он получит местоположение или если он потерпит неудачу. В обоих этих методах вы можете вызвать [locationManager stopUpdatingLocation].

Внутри метода didUpdateToLocation вы должны переместить весь свой код из viewDidLoad, начиная с CLLocation *location = [locationManager location]; Вот где вы получите правильные значения.

7 голосов
/ 16 мая 2011

Чтобы получить местоположение пользователя, даже если вам нужно сделать locationManager, чтобы начать обновление местоположений (вы это сделали) и внедрить метод делегата, который диспетчер вызывает при получении местоположения - вы не можете сразу получить местоположение из диспетчера местоположений.

Если вы не хотите отслеживать местоположение пользователя - просто прекратите обновление местоположений в этом методе делегата после того, как местоположение было выбрано в первый раз (и сохраните его, если оно понадобится вам в будущем).

6 голосов
/ 19 марта 2012

Это сработало для меня

- (void)viewDidLoad {
    [super viewDidLoad];
    // locationManager update as location
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self; 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    locationManager.distanceFilter = kCLDistanceFilterNone; 
    [locationManager startUpdatingLocation];
    [locationManager stopUpdatingLocation];
    CLLocation *location = [locationManager location];
    // Configure the new event with information from the location

    float longitude=location.coordinate.longitude;
    float latitude=location.coordinate.latitude;

    NSLog(@"dLongitude : %f", longitude);
    NSLog(@"dLatitude : %f", latitude); 
}
3 голосов
/ 08 октября 2014

Попробуйте этот код

-(IBAction)Button:(id)sender

{

locationManager = [[CLLocationManager alloc] init]; 

locationManager.delegate = self;

locationManager.desiredAccuracy = kCLLocationAccuracyBest;

locationManager.distanceFilter = kCLDistanceFilterNone;

[locationManager startUpdatingLocation];

CLLocation *location = [locationManager location];

// Настройка нового события с информацией из местоположения

CLLocationCoordinate2D coordinate = [location coordinate];

NSString *latitude = [NSString stringWithFormat:@"%f", coordinate.latitude];

NSString *longitude = [NSString stringWithFormat:@"%f", coordinate.longitude];

NSLog(@"dLatitude : %@", latitude);

NSLog(@"dLongitude : %@",longitude);

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50, 40, 250, 50)];

UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 80, 200, 50)];

UILabel *myLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(50, 120, 200, 100)];

myLabel.textColor = [UIColor blackColor];

myLabel1.textColor = [UIColor blackColor];

label.backgroundColor = [UIColor clearColor];

myLabel.backgroundColor = [UIColor clearColor];

myLabel1.backgroundColor = [UIColor clearColor];

[myLabel setText:latitude];

[myLabel1 setText:longitude];

label.text = @"Current Latitude And Longitude";

[self.view addSubview:label];

[self.view addSubview:myLabel];

[self.view addSubview:myLabel1];

}
1 голос
/ 21 октября 2016

если вы получаете Lat lang обоим (0,00, 0,00)

, это может быть решением для вас,

шаг 1: NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription

Добавьте эти два ключа в Info.plist

шаг 2: И чем [locationManager startUpdatingLocation]; начните обновление

шаг 3: и вам нужно реализовать два метода

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {

}

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



 CLLocation * currentLocation = [locations lastObject];

    NSLog(@"Updated Lat %f",currentLocation.coordinate.longitude);
    NSLog(@"Updated Lang %f",currentLocation.coordinate.latitude);



}

из CLLocationManagerDelegate в интерфейсе ViewController.

**step 4:**

-(void)viewDidLoad
{
    [super viewDidLoad];
 geocoder = [[CLGeocoder alloc] init];
    manager.delegate = self;
    manager.desiredAccuracy = kCLLocationAccuracyBest;
    [manager requestWhenInUseAuthorization];
    [manager requestAlwaysAuthorization];
    [manager startUpdatingLocation];


}
...