虽然我认为位置感知编程指南的向地图添加注释部分对此进行了详细讨论,但我有一些观察:
你问“我需要使用MKAnnotation
吗?” 是和不是。
是的,所有注释都应该符合MKAnnotation
协议。如该指南所述,如果您可以创建自己的注释子类,则希望它明确声明它符合MKAnnotation
协议。
但是,不,您不必总是创建自己的符合MKAnnotation
协议的注释类。您还可以使用预定义的注释类MKPointAnnotation
(它本身已经符合MKAnnotation
协议),例如:
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
annotation.coordinate = CLLocationCoordinate2DMake(39.281516, -76.580806);
annotation.title = @"Lens Crafters";
annotation.subtitle = @"2400 Boston St.";
[self.mapView addAnnotation:annotation];
如果您希望在地图上放置新注释时旧注释消失,您只需 (a) 保留对旧注释的引用;(b) 添加新注释时,删除旧注释(如果您有旧注释);然后 (c) 添加您的新注释。
因此,您可能已经为注释定义了一些类属性:
@property (weak, nonatomic) id<MKAnnotation> annotation;
(两个方面的观察:首先,您是否使用weak
或strong
取决于您和您的应用程序设计。通过说weak
,我是说当注释从地图中删除时,我很高兴annotation
发布。也许你想要它保留,直到你明确nil
这个属性,在这种情况下你会做这个属性strong
。这完全取决于你和你的应用程序的目标。其次,我使用类型id<MKAnnotation>
(即“符合的对象MKAnnotation
”),这使得它更灵活. 如果你以后MKPointAnnotation
用你自己的自定义注解类替换,这个属性仍然可以工作。但是如果你想显式地定义这个annotation
属性来MKPointAnnotation
匹配你的注解添加例程,那也没关系。)
无论如何,既然你有了这个属性,你现在可以编写一个方法来为你的地图添加一个注释(删除旧的):
- (void)addAnnotationAtCoordinate:(CLLocationCoordinate2D)coordinate
title:(NSString *)title
subtitle:(NSString *)subtitle
{
if (self.annotation)
[self.mapView removeAnnotation:self.annotation];
MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
annotation.coordinate = coordinate;
annotation.title = title;
annotation.subtitle = subtitle;
[self.mapView addAnnotation:annotation];
self.annotation = annotation;
}