我正在开发一款简单的类似GPS的应用。我创建了一个扩展MKAnnotation的自定义对象,它也可以正常工作。我可以放置它等,但是如果我在我的代码中放置这段代码[mpm setCoordinate:loc];
,应用程序会打开并冻结,同时显示基本的灰色网格(不显示任何下载的地图,而不是我的按钮工作)
这是我的标题:
@interface FirstViewController : UIViewController <MKMapViewDelegate>
{
IBOutlet MKMapView *mapView;
MyPlaceMark *mpm;
}
-(void)locationUpdate:(CLLocation *)location;
-(void)locationError:(NSError *)error;
@end
以下是我尝试更新内容的代码:
-(void)locationUpdate:(CLLocation *)location
{
CLLocationCoordinate2D loc = [location coordinate];
[mpm setCoordinate:loc]; // This line messes it up.
[mapView setCenterCoordinate:loc];
if([mapView showsUserLocation] == NO)
[mapView setShowsUserLocation:YES]; // This does not show my position either?
}
如果我评论该行,该应用程序工作正常。我需要更新注释,因为它将成为我显示用户当前位置的标记。 PS:没有那一行,它确实以我的视图为中心 - 所以location
是一个有效/设置变量。
我的viewDidLoad
看起来像这样:
- (void)viewDidLoad {
mapView = [[MKMapView alloc] initWithFrame:self.view.bounds];
//mapView.showsUserLocation = YES;
[mapView setShowsUserLocation:YES];
mapView.mapType = MKMapTypeStandard;
mapView.delegate = self;
CLLocationCoordinate2D location;
MKCoordinateRegion region;
location.latitude = -33.8;
location.longitude = 18.6;
MKCoordinateSpan span;
span.latitudeDelta = 0.01;
span.longitudeDelta = 0.01;
region.span = span;
region.center = location;
[mapView setRegion:region animated:TRUE];
[mapView regionThatFits:region];
mpm = [[MyPlaceMark alloc] initWithCoordinate:location]; // Creating mpm
[mapView addAnnotation:mpm]; // Adding mpm
[self.view addSubview:mapView];
[super viewDidLoad];
}
在我更改位置后,我应该重新添加mpm
吗?或者它只是跳到地图上的新位置?
所以回顾一下这个问题:如何在我的mapview上更新自定义MKAnnotation的位置?
感谢您的时间!
编辑:我认为崩溃的主要原因是我没有在自定义MKAnnotation中创建setCoordinate
方法/函数。我如何覆盖它但保持与原始相同?
日志控制台中的错误:
2011-06-09 14:42:40.377 AeroNav[3706:707] -[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0
2011-06-09 14:42:40.493 AeroNav[3706:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyPlaceMark setCoordinate:]: unrecognized selector sent to instance 0x19e0e0'
...
terminate called after throwing an instance of 'NSException'
答案 0 :(得分:0)
[mapView setShowsUserLocation:YES]
不会更新地图显示的区域。您必须实现委托方法didUpdateUserLocation:
并在那里调用setRegion:animated:
以将区域移动到用户的位置。在第一次调用此函数之前,userLocation
的{{1}}属性未设置。
对于MKMapView
事物,MKAnnotation
是一种协议。它没有默认实现。您必须提供您同意遵守的所有方法和属性。因此,声明一个与MKAnnotation
协议中的属性非常类似的属性。