情况如下,我在MacOS 10.7上运行xCode 4.1,启动iPhone模拟器并使用MapKit尝试获取 REAL 用户的坐标...默认用户的位置在美国库比蒂诺。为了得到这一点,我使用了:
self.mapView.userLocation.location.coordinate
......但这让我到了地图的中心(在非洲)......
问题#1:为什么???为什么用户的引脚设置为Cupertino但其坐标为(lat:0,lon:0)在非洲?
......然后......
我已将我的控制器设置为CCLocationManagerDelegate和MKMapViewdelegate,并将控制器初始化为CCLocationManagerDelegate事件的委托...但这些委托方法都没有被调用...
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
问题#2:为什么委托方法甚至不会被触发一次?
我的控制器:
//@interface MapController : UIViewController<CLLocationManagerDelegate, MKMapViewDelegate>
//@property (nonatomic, retain) MapModel *mapModel;
//@property (nonatomic, retain) IBOutlet MKMapView *mapView;
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{ ... }
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{ ... }
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{ ... }
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapModel = [[[MapModel alloc] init:self] autorelease];
[self.mapView setShowsUserLocation:YES];
[self.mapView setZoomEnabled:YES];
[self.mapView setScrollEnabled:YES];
[self.mapView setMapType:MKMapTypeStandard];
CLLocationCoordinate2D x =
self.mapView.userLocation.location.coordinate; // (0,0) why???
//[self.mapView setRegion:xx animated:YES];
//[self.mapView regionThatFits:self.mapModel.region];
[[self.mapView userLocation] setCoordinate:[x coordinate]];
}
...
模特:
//@property (nonatomic, copy) NSString *user;
//@property (nonatomic, copy) NSString *caption;
//@property (nonatomic, copy) NSString *description;
//@property (nonatomic, assign) MKCoordinateRegion region;
//@property (nonatomic, retain) CLLocationManager *manager;
- (id)init :(id)delegate
{
self.manager = [[[CLLocationManager alloc] init] autorelease];
self.manager.delegate = delegate;
self.manager.distanceFilter = kCLDistanceFilterNone;
self.manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
[self.manager startUpdatingLocation];
MKCoordinateRegion region = {{0, 0}, {0.2, 0.2}};
self.region = region;
return self;
}
谢谢,艺术
答案 0 :(得分:2)
模拟器中的默认位置是Cupertino。在最新的Xcode(4.2,我相信)中,您可以从预先填充的位置菜单中设置模拟器的位置(您可以通过在项目中包含GPX文件来添加自己的位置)。
如果你在设备上运行并启用APP的位置服务,你应该使用你的代码获得一个有效的位置。
答案 1 :(得分:0)
让我澄清一下我的问题...... 据我所知,userLocation似乎在模拟器上似乎是零......好吧......但第二个问题是为什么没有调用CLLocationManagerDelegate方法“didUpdateToLocation”? 我看到了这个教程,即使在模拟器上也应该调用它... 那我做错了什么? http://www.youtube.com/watch?v=qNMNRAbIDoU&feature=related 同时我在日志中得到这样的错误 - “服务器不接受客户注册68” 这可能是没有调用位置委托的原因吗?
更新:
我在xCode 4.3上尝试了这个,它仍然不起作用...... 首先调用userLocation,它在第二个返回(0,0) - (-180,-180)
然后我切换到IOS 5 SDK,现在Map完全没有加载错误 - __GEORegisterNetworkDefaults_block_invoke_0: Could not connect to geod on com.apple.geod.defaults
更新:
卸载所有xCode版本然后安装稳定的4.2版本确实有帮助...... 已解决!!!