位置管理器给出空坐标

Posted

技术标签:

【中文标题】位置管理器给出空坐标【英文标题】:location manager giving null coordinates 【发布时间】:2013-10-26 06:48:12 【问题描述】:

以下代码生成空坐标。奇怪的是,提示应用使用当前位置的 UIAlert 会在用户选择是之前短暂出现。

我使用过的代码:

CLLocationManager *locationManager;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
locationManager = [[CLLocationManager alloc] init];
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[locationManager startUpdatingLocation];
float latitude = locationManager.location.coordinate.latitude;
float longitude = locationManager.location.coordinate.longitude;
NSLog(@"%.8f",latitude);
NSLog(@"%.8f",longitude);

NSLog 为两个坐标打印0.0000000

谢谢!

【问题讨论】:

我做了UILabels并将文本分别设置为坐标,但仍然有临时UIalert的错误,坐标仍然是0.000000 【参考方案1】:

你得到 0 的原因是因为位置管理器当时没有收集任何数据(它已经开始考虑)

您需要将您的类设置为位置管理器的委托(即提供一个在检索到新位置时调用的函数),并保留您的位置管理器。

// Inside .m file

@interface MyClass () <CLLocationManagerDelegate> // Declare this class to implement protocol CLLocationManagerDelegate

@property (strong, nonatomic) CLLocationManager* locationManager; // Retains it with strong keyword

@end

@implementation MyClass

// Inside some method

   self.locationManager = [[CLLocationManager alloc] init];
   self.locationManager.delegate = self;
   self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
   self.locationManager.distanceFilter = kCLDistanceFilterNone;
   [self.locationManager startUpdatingLocation];

// Delegate method
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
    CLLocation* loc = [locations lastObject]; // locations is guaranteed to have at least one object
    float latitude = loc.coordinate.latitude;
    float longitude = loc.coordinate.longitude;
    NSLog(@"%.8f",latitude);
    NSLog(@"%.8f",longitude);

【讨论】:

它有效,但是我得到三对坐标而不是一对。我在 viewDidLoad 中实现了所有 self."" 参数。不确定这是否有任何区别。有任何想法吗?此外,当我重新加载屏幕时,它会根据需要打印出一对。 这些数组旨在包含您的应用程序以某种方式“错过”的位置(不确定这意味着什么,可能是当应用程序繁忙或在后台时)。通常最后一个就足够了,但这完全取决于您正在制作的应用程序类型。例如,如果您试图记录用户曾经的位置(移动历史),您可能需要读取整个数组。 我做了一些调试,似乎是 locationManager 函数被多次调用。有什么办法吗? 这不是错误,位置管理器在获取新用户位置时调用(即使用户没有移动)。如果您只想获得一次位置,请在获得位置后使用[locationManager stopUpdatingLocation] 将其关闭。其他选项是检查坐标以查看用户是否实际移动,或将distanceFilter 设置为非零值(顺便说一句,以米为单位)。

以上是关于位置管理器给出空坐标的主要内容,如果未能解决你的问题,请参考以下文章

如果 gps 打开,位置管理器不起作用。如果 gps 打开,它工作正常

位置管理器Android错误的位置

如何从位置管理器只复制一次用户位置?

三十Java图形化界面设计——布局管理器之null布局(空布局)

模拟坐标 Android Marshmallow

更新控制器中的位置,而位置管理器在其他控制器中初始化