8

我正在尝试使用此 viewDidLoad 方法获取用户当前的纬度和经度。生成的地图正确地指示了当前位置,但是 NSLog 始终显示:

2009-09-19 16:45:29.765 Mapper[671:207] user latitude = 0.000000
2009-09-19 16:45:29.772 Mapper[671:207] user longitude = 0.000000

有人知道我在这里想念什么吗?在此先感谢您的帮助!

- (void)viewDidLoad {
    [super viewDidLoad];
    [mapView setMapType:MKMapTypeStandard];
    [mapView setZoomEnabled:YES];
    [mapView setScrollEnabled:YES];
    [mapView setShowsUserLocation:YES];

    CLLocation *userLoc = mapView.userLocation.location;
    CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

    NSLog(@"user latitude = %f",userCoordinate.latitude);
    NSLog(@"user longitude = %f",userCoordinate.longitude);
}
4

8 回答 8

10

据我所知,地图在实际显示之前不会尝试获取用户位置。一个很好的测试是,什么时候会出现询问应用程序是否可以获取用户位置的对话框?以我的经验,只有在地图显示在屏幕上之后才会出现。

如果您在启动时必须有一个位置,则解决此问题的最佳方法是实现经典的核心位置处理程序代码并最初从中获取位置。地图启动后,您可以停止从那里接收更新并从那里获得进一步的更改(尽管如果您需要不断更新,最好保持标准的核心位置更新。如果您考虑一下,当您有“显示用户在地图中启用“位置”,您的应用程序进一步使用核心位置基本上是免费的,因为无论如何 GPS 都会一直启动。

于 2009-09-20T02:05:14.617 回答
4

如果您尝试在 viewDidLoad() 方法中获取用户坐标,它将始终给出 0,0 结果,因为它尚未初始化。

您应该查看 Apple 网站的“我在哪里”示例代码。它解释了你需要什么。您需要使用CLLocationManager类。您还需要该方法

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

每次更新用户位置时都会自动调用此方法。如果你使用的是模拟器,那么这个方法只会被调用一次,它会返回一些默认的坐标。

希望能帮助到你。

于 2009-09-21T05:36:57.857 回答
2

CLLocation上的文档中,如果水平精度或垂直精度为负数,则表示找不到值。我怀疑这就是这里发生的事情。请记住,如果您只看一次,它可能会在提高准确性结果之前为您提供一个近似的最后已知位置。

水平精度 坐标的纬度和经度标识圆心,该值表示该圆的半径。负值表示坐标的经纬度无效。

于 2009-09-19T20:55:23.117 回答
1

您应该从 CoreLocation 而不是 MapKit 获取坐标。MapView 将在实际获得当前位置后显示用户的位置。在确定位置之前,将经纬度都设置为0。3

您应该创建一个 CLLocationManager 实例,设置委托。确定位置后会通知您。

于 2009-09-20T05:17:33.310 回答
1

正如Kendall所说,MKMapView 在完成加载之前没有用户位置,并且 viewDidLoad 方法通常为时过早请求它。比使用 CoreLocation 更简单的方法是实现 MKMapViewDelegate 方法 -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation。它会在定位后立即为您提供用户的位置,而无需处理 CLLocationManager。

于 2013-01-08T17:33:46.803 回答
0

这个答案解释了如何使用用户位置设置地图视图:

如何使用给定的用户位置初始化 MKMapView?

于 2010-03-09T15:52:34.487 回答
0

试试这个

CLLocation *userLoc = mapView.userLocation.location;
CLLocationCoordinate2D userCoordinate = userLoc.coordinate;

NSLog(@"user latitude = %f",userCoordinate.latitude);
NSLog(@"user longitude = %f",userCoordinate.longitude);

ViewdidAppear: 或延迟后调用执行选择器

于 2014-05-05T11:32:24.023 回答
-1

将此添加到您的 viewDidLoad 部分

mapView.showsUserLocation = YES;
于 2010-05-02T04:56:47.133 回答