如何删除MKMapView上的所有注释


Answers:


246

是的,这是

[mapView removeAnnotations:mapView.annotations]

但是,上一行代码将从地图上删除所有地图注释“ PINS”,包括用户位置图钉“ Blue Pin”。要删除所有地图注释并将用户位置图钉保留在地图上,有两种可能的方法

示例1,保留用户位置注释,删除所有图钉,重新添加用户位置图钉,但是这种方法存在缺陷,由于删除了该图钉然后将其添加,该方法将导致用户位置图钉在地图上闪烁背部

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];

    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

示例2,我个人比较喜欢避免首先删除位置用户图钉,

- (void)removeAllPinsButUserLocation2
{
    id userLocation = [mapView userLocation];
    NSMutableArray *pins = [[NSMutableArray alloc] initWithArray:[mapView annotations]];
    if ( userLocation != nil ) {
        [pins removeObject:userLocation]; // avoid removing user location off the map
    }

    [mapView removeAnnotations:pins];
    [pins release];
    pins = nil;
}

1
这也会删除用户位置吗?如果要删除用户位置以外的所有注释该怎么办?
凯文·门多萨

1
您不需要保存对用户位置的任何引用。阅读下面的答案以获取更多信息。
Aviel Gross 2014年

36

这是最简单的方法:

-(void)removeAllAnnotations
{
  //Get the current user location annotation.
  id userAnnotation=mapView.userLocation;

  //Remove all added annotations
  [mapView removeAnnotations:mapView.annotations]; 

  // Add the current user location annotation again.
  if(userAnnotation!=nil)
  [mapView addAnnotation:userAnnotation];
}

一个好答案,比遍历所有这些要快得多,尤其是如果您有少数注解的话。
马修·弗雷德里克

6
删除注释,然后再添加回注释,会使图钉在地图上闪烁。对于某些应用程序来说可能不是什么大问题,但是如果您使用新的注释不断更新地图,对于用户来说可能会很烦恼。
RocketMan

由于某种原因,使用此方法时,我的userLocation注释始终消失。Victor Van Hee的解决方案对我有用。
斯蒂芬·伯恩斯

17

以下是删除除用户位置以外的所有注释的方法,这些注释已明确写出,因为我想我会再次寻找该答案:

NSMutableArray *locs = [[NSMutableArray alloc] init];
for (id <MKAnnotation> annot in [mapView annotations])
{
    if ( [annot isKindOfClass:[ MKUserLocation class]] ) {
    }
    else {
        [locs addObject:annot];
    }
}
[mapView removeAnnotations:locs];
[locs release];
locs = nil;

谢谢,这对我有用,它可以复制并粘贴并删除[locs release]并将mapView更改为_mapView。我在devfright.com/mkdirections-tutorial上关注MKDirections的优秀教程,并希望在获得指导后将其移除。我在该方法最后一行下面的代码中添加了“清晰路线”方法-Hblegg 2014
37

更新删除多个-(IBAction)clearRoute:(UIBarButtonItem *)sender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay:routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for([_mapView批注]中的id <MKAnnotation> annot){ }} [_mapView removeAnnotations:locs]; [_mapView removeOverlays:_mapView.overlays]; }
Hblegg 2014年

13

这与Sandip的答案非常相似,不同之处在于它不会重新添加用户位置,因此蓝点不会再次闪烁。

-(void)removeAllAnnotations
{
    id userAnnotation = self.mapView.userLocation;

    NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
    [annotations removeObject:userAnnotation];

    [self.mapView removeAnnotations:annotations];
}

11

您不需要保存对用户位置的任何引用。所有需要的是:

[mapView removeAnnotations:mapView.annotations]; 

只要将mapView.showsUserLocation设置为YES,您在地图上仍将具有用户位置。将此属性设置为YES基本上是要求地图视图开始更新和获取用户位置,以将其显示在地图上。从MKMapView.h评论:

// Set to YES to add the user location annotation to the map and start updating its location

我最终使用这种格式:[self.mapView.removeAnnotations(mapView.annotations)]
爱德华·

6

迅捷版:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}

6

迅捷3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}

2

Swift 2.0简单又最好:

mapView.removeAnnotations(mapView.annotations)

0

要删除一种类型的子类,您可以执行

mapView.removeAnnotations(mapView.annotations.filter({$0 is PlacesAnnotation}))

PlacesAnnotation的子类在哪里MKAnnotation

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.