web-dev-qa-db-fra.com

Comment supprimer toutes les annotations de MKMapView sauf l'annotation d'emplacement d'utilisateur? 

J'utilise removeAnnotations pour supprimer mes annotations de mapView mais pareil, il supprime l'emplacement utilisateur ann. Comment puis-je empêcher cela, ou comment faire revenir l'utilisateur à ann?

NSArray *annotationsOnMap = mapView.annotations;
        [mapView removeAnnotations:annotationsOnMap];
38
Pavel Kaljunen

Mettre à jour:

Lorsque j'ai essayé avec iOS 9 SDK, l'annotation de l'utilisateur n'est plus supprimée. Vous pouvez simplement utiliser

mapView.removeAnnotations(mapView.annotations)

Réponse historique (pour les applications qui s'exécutent sur iOS avant iOS 9):

Essaye ça:

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

EDIT: version rapide

let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
85
nielsbot

Pour effacer toutes les annotations de la carte:

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

Pour supprimer les annotations spécifiées de Mapview 

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

}

J'espère que cela peut vous aider.

20
Aswathy Bose

Pour Swift, vous pouvez simplement utiliser un one-liner:

mapView.removeAnnotations(mapView.annotations)

Edit: Comme nielsbot l'a mentionné, cela supprimera également l'annotation d'emplacement de l'utilisateur, à moins que vous ne l'ayez configurée comme suit:

mapView.showsUserLocation = true
7
raspi

Si votre emplacement utilisateur correspond à la classe MKUserLocation, utilisez isKindOfClass pour éviter de supprimer les annotations d'emplacement utilisateur.

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

}

Sinon, vous pouvez définir un indicateur pour reconnaître le type de vos annotations dans – mapView:viewForAnnotation:.

3
bradley

Que diriez-vous d'un filtre NSPredicate?

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

La vie est toujours meilleure avec le filtre NSPredicate

0
Laszlo

Dans Swift 4.1 :

Normalement, si vous ne souhaitez pas supprimer votreMKUserLocationannotation, vous pouvez simplement exécuter:

self.mapView.removeAnnotations(self.annotations).

Cette méthode par défaut ne supprime pas l'annotationMKUserLocationde la liste annotations.

Toutefois, si vous devez filtrer toutes les annotations à l'exception de la variableMKUserLocation(voir la variable annotationsNoUserLocation ci-dessous), pour toute autre raison, telle que le centrage sur toutes les annotations sauf l'annotationMKUserLocationpouvez utiliser cette simple extension ci-dessous.

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)
    }

}
0
madx