MKMapView Annotation setCoordinate崩溃的应用程序

时间:2011-06-09 11:50:29

标签: iphone mkmapview mkannotation

我正在开发一款简单的类似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'

1 个答案:

答案 0 :(得分:0)

[mapView setShowsUserLocation:YES]不会更新地图显示的区域。您必须实现委托方法didUpdateUserLocation:并在那里调用setRegion:animated:以将区域移动到用户的位置。在第一次调用此函数之前,userLocation的{​​{1}}属性未设置。

对于MKMapView事物,MKAnnotation是一种协议。它没有默认实现。您必须提供您同意遵守的所有方法和属性。因此,声明一个与MKAnnotation协议中的属性非常类似的属性。