我正在尝试根据我的坐标精确获取当前位置。我在我的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);
}
答案 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
,则尚未确定任何位置。