How to delete all Annotations on a MKMapView

Objective CIphone Sdk-3.0AnnotationsMkmapview

Objective C Problem Overview


Is there a simple way to delete all the annotations on a map without iterating through all the displayed annotations in Objective-c?

Objective C Solutions


Solution 1 - Objective C

Yes, here is how

[mapView removeAnnotations:mapView.annotations]

> However the previous line of code will remove all map annotations "PINS" from > the map, including the user location pin "Blue Pin". To remove all map > annotations and keep the user location pin on the map, there are two > possible ways to do that > > > Example 1, retain the user location annotation, remove all pins, add > the user location pin back, but there is a flaw with this approach, it > will cause the user location pin to blink on the map, due to removing > the pin then adding it back

- (void)removeAllPinsButUserLocation1 
{
    id userLocation = [mapView userLocation];
    [mapView removeAnnotations:[mapView annotations]];
    
    if ( userLocation != nil ) {
        [mapView addAnnotation:userLocation]; // will cause user location pin to blink
    }
}

> Example 2, I personally prefer to avoid removing the location user pin > in the first place,

- (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;
}

Solution 2 - Objective C

Here is the simplest way to do that:

-(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];
}

Solution 3 - Objective C

Here's how to remove all annotations except the user location, written out explicitly because I imagine I will come looking for this answer again:

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;

Solution 4 - Objective C

This is very similar to Sandip's answer, except that it doesn't re-add the user location so the blue dot doesn't blink on and off again.

-(void)removeAllAnnotations
{
    id userAnnotation = self.mapView.userLocation;
    
    NSMutableArray *annotations = [NSMutableArray arrayWithArray:self.mapView.annotations];
    [annotations removeObject:userAnnotation];
    
    [self.mapView removeAnnotations:annotations];
}

Solution 5 - Objective C

You do not need to save any reference to user location. All that is needed is:

[mapView removeAnnotations:mapView.annotations]; 

And as long as you have mapView.showsUserLocation set to YES, you will still have user location on the map. Settings this property to YES basically asks the map view to start updating and fetching user location, to to show it on the map. From the MKMapView.h comments:

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

Solution 6 - Objective C

Swift version:

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

Solution 7 - Objective C

Swift 3

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

Solution 8 - Objective C

Swift 2.0 Simple and the best:

mapView.removeAnnotations(mapView.annotations)

Solution 9 - Objective C

To remove one type of subclass you can do

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

where PlacesAnnotation is a subclass of MKAnnotation

Solution 10 - Objective C

Here is the function to remove all markers as well as all routes (if any) from MKMapView:

 func removeAppleMapOverlays() {
    let overlays = self.appleMapView.overlays
    self.appleMapView.removeOverlays(overlays)
    let annotations = self.appleMapView.annotations.filter {
            $0 !== self.appleMapView.userLocation
        }
    self.appleMapView.removeAnnotations(annotations)
}

Cheers

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionkevin MendozaView Question on Stackoverflow
Solution 1 - Objective CRocketManView Answer on Stackoverflow
Solution 2 - Objective CSandip SarkarView Answer on Stackoverflow
Solution 3 - Objective CVictor Van HeeView Answer on Stackoverflow
Solution 4 - Objective CChrisView Answer on Stackoverflow
Solution 5 - Objective CAviel GrossView Answer on Stackoverflow
Solution 6 - Objective CKosuke OgawaView Answer on Stackoverflow
Solution 7 - Objective CmckanetView Answer on Stackoverflow
Solution 8 - Objective CMaselkoView Answer on Stackoverflow
Solution 9 - Objective CTharakView Answer on Stackoverflow
Solution 10 - Objective CHaseeb JavedView Answer on Stackoverflow