How do I remove all annotations from MKMapView except the user location annotation?
Asked Answered
S

8

40

I use removeAnnotations to remove my annotations from mapView but same it remove user location ann. How can I prevent this, or how to get user ann back to view?

NSArray *annotationsOnMap = mapView.annotations;
        [mapView removeAnnotations:annotationsOnMap];
Safier answered 2/6, 2012 at 19:3 Comment(0)
S
98

Update:

When I tried with the iOS 9 SDK the user annotation is no longer removed. You can simply use

mapView.removeAnnotations(mapView.annotations)

Historical answer (for apps that run on iOS before iOS 9):

Try this:

NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;

EDIT: Swift version

let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
Suzetta answered 3/6, 2012 at 3:16 Comment(5)
I've tried using this instead: self.mapView.viewForAnnotation(annotation!)?.hidden = true but it was giving me weird errors when I change map region. Yours is the better way, thank you!Kazoo
I implemented this code but I get a fatal error: unexpectedly found nil. I checked whether annotationsToRemove counts greater than one. I have no idea why I am getting this error. Please help me.Kramer
you have to look and see what line is failed onSuzetta
It's in the MapView.removeAnnotations lineKramer
Do you have any ! in your code? How is your MapView variable defined? Change any ! to ? and then further modify your code so it compiles. The crash will probably be resolved.Suzetta
A
21

To clear all the annotations from the map:

[self.mapView removeAnnotations:[self.mapView annotations]];

To remove specified annotations from Mapview

 for (id <MKAnnotation> annotation in self.mapView.annotations)
{
    if (![annotation isKindOfClass:[MKUserLocation class]])
    {
              [self.mapView removeAnnotation:annotation];   
    }

}

Hope this may help you.

Aggress answered 19/2, 2013 at 4:4 Comment(1)
This answer is much more concise than the accepted one.Concision
V
7

For Swift you can simply use a one-liner:

mapView.removeAnnotations(mapView.annotations)

Edit: As nielsbot mentioned it will also remove the user's location annotation unless you have set it up like this:

mapView.showsUserLocation = true
Voracious answered 18/6, 2015 at 13:49 Comment(2)
this removes all the annotations, which is not what OP wanted.Suzetta
The behavior has changed.Suzetta
L
3

If your user location is kind of class of MKUserLocation, use isKindOfClass to avoid removing user location annotation.

if (![annotation isKindOfClass:[MKUserLocation class]]) {

}

Else you can set a flag to recognize the kind of your annotations in – mapView:viewForAnnotation:.

Lacagnia answered 3/6, 2012 at 3:13 Comment(0)
P
1

Swift 4.2 or later

Add this line before adding the annotations

mapView.removeAnnotations(mapView.annotations.filter { $0 !== mapView.userLocation })
Parthenope answered 27/11, 2019 at 9:29 Comment(1)
Most efficient answer.Therm
B
0

How about some NSPredicate filter?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];

Life is always better with NSPredicate filter

Boeotia answered 14/7, 2016 at 20:24 Comment(0)
L
0

In Swift 4.1:

Normally if you don't want to remove your MKUserLocation annotation you can simply run:

self.mapView.removeAnnotations(self.annotations).

This method by default does not remove the MKUserLocation annotation from the annotations list.

However if you need to filter out all annotations except the MKUserLocation (see annotationsNoUserLocation variable below) for any other reason, like centering on all the annotations but the MKUserLocation annotation you can use this simple extension below.

extension MKMapView {

    var annotationsNoUserLocation : [MKAnnotation] {
        get {
            return self.annotations.filter{ !($0 is MKUserLocation) }
        }
    }

    func showAllAnnotations() {
        self.showAnnotations(self.annotations, animated: true)
    }

    func removeAllAnnotations() {
        self.removeAnnotations(self.annotations)
    }

    func showAllAnnotationsNoUserLocation() {
        self.showAnnotations(self.annotationsNoUserLocation, animated: true)
    }

}
Lido answered 31/10, 2018 at 14:20 Comment(0)
L
-1

Hi try this i got the solution from this code:

 NSMutableArray*listRemoveAnnotations = [[NSMutableArray alloc] init];
[Mapview removeAnnotations:listRemoveAnnotations];

 [listRemoveAnnotations release];
Lipography answered 30/11, 2012 at 6:46 Comment(1)
this doesn't answer the question. In fact this code as no effect--listRemoveAnnotations is empty when -removeAnimations is called.Suzetta

© 2022 - 2024 — McMap. All rights reserved.