获取坐标CLLocationManager IOS

时间:2014-12-26 21:41:50

标签: ios gps cllocationmanager cllocation

我正在尝试根据我的坐标精确获取当前位置。我在我的CLLocationManager viewController中实施了myLocation。 我的问题是,我第一次没有得到我的坐标,但是当我再次接近时,我得到了坐标。我无法理解为什么这不是第一次出现的问题。 我还试图给NSTimer stoplocation,但是第一次仍然无法得到结果,每次第一次得到(null)值,然后得到坐标。< / p>

我的代码:

#import <UIKit/UIKit.h>
#import <Corelocation/CoreLocation.h>
@interface myLocation : UITableViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;

@end

@interface myLocation () {
    CLLocationManager* _locationManager;
    NSString * _lat;
    NSString * _lng;
}
@end

@implementation myLocation

- (void)viewDidLoad
{
    [super viewDidLoad];
    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.distanceFilter = kCLDistanceFilterNone;
    _locationManager.delegate = self;
    _locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
        [_locationManager requestWhenInUseAuthorization];

    [_locationManager startUpdatingLocation];

}
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations {
    CLLocation *location = [locations lastObject];
    [_locationManager stopUpdatingLocation];
    _lat =[NSString stringWithFormat:@"%f",location.coordinate.latitude];
     _lng =[NSString stringWithFormat:@"%f",location.coordinate.longitude];
}
- (void)viewWillAppear:(BOOL) animated
{
 NSLOG(@"%@",_lat);   
 NSLOG(@"%@",_lng);       
}

2 个答案:

答案 0 :(得分:1)

当您尝试在viewWillAppear:中打印时,您的坐标尚未显示,因为CLLocationManager还没有足够的时间来检索第一个位置。等到第一次调用didUpdateLocations:之后再尝试使用设备坐标,因为didUpdateLocations:是您将接收这些坐标的位置。我建议您删除尝试从viewWillAppear打印坐标代码的操作,只需将其打印在didUpdateLocations:中即可。

在评论中,OP表示他希望在viewWillAppear期间“刷新”该位置。我建议在视图消失后停止更新,并在视图重新出现后立即重新启动更新:

- (void)viewWillAppear:(BOOL) animated
{
    [_locationManager startUpdatingLocation];
}

- (void)viewWillDisappear:(BOOL) animated
{
    [_locationManager stopUpdatingLocation];
}

答案 1 :(得分:0)

启动位置服务并调用您的委托方法需要一些时间 - 如果您只是在viewWillAppear中启动位置服务,这几乎肯定不会在调用viewDidLoad之前发生。此外,您的应用首次执行时必须等待用户授予权限。

您可以检查location的{​​{1}}属性以获取最新位置。如果是CLLocationManager,则尚未确定任何位置。