Comment supprimer toutes les annotations sur un MKMapView

99

Existe-t-il un moyen simple de supprimer toutes les annotations sur une carte sans parcourir toutes les annotations affichées dans Objective-c?

Kevin Mendoza
la source

Réponses:

246

Oui, voici comment

[mapView removeAnnotations:mapView.annotations]

Cependant, la ligne de code précédente supprimera toutes les annotations de carte "PINS" de la carte, y compris la broche de localisation de l'utilisateur "Blue Pin". Pour supprimer toutes les annotations de la carte et conserver l'épingle de localisation de l'utilisateur sur la carte, il existe deux méthodes possibles.

Exemple 1, conservez l'annotation de l'emplacement de l'utilisateur, supprimez toutes les broches, ajoutez la broche de l'emplacement de l'utilisateur, mais il y a un défaut avec cette approche, cela provoquera le clignotement de la broche de l'emplacement de l'utilisateur sur la carte, en raison de la suppression de la broche puis de son ajout arrière

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

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

Exemple 2, je préfère personnellement éviter de supprimer la broche de l'utilisateur de l'emplacement en premier lieu,

- (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;
}
RocketMan
la source
1
cela supprime-t-il également l'emplacement de l'utilisateur? que faire si je souhaite supprimer toutes les annotations en plus de l'emplacement de l'utilisateur?
kevin Mendoza
1
Vous n'avez pas besoin d'enregistrer de référence à l'emplacement de l'utilisateur. Lisez ma réponse ci-dessous pour plus d'informations.
Aviel Gross
36

Voici le moyen le plus simple de le faire:

-(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];
}
Sandip Sarkar
la source
Bonne réponse, beaucoup plus rapide que de les parcourir toutes, surtout si vous avez plus d'une poignée d'annotations.
Matthew Frederick
6
Si vous supprimez une annotation puis l'ajoutez à nouveau, la broche clignote sur la carte. Ce n'est peut-être pas un gros problème pour certaines applications, mais cela peut être ennuyeux pour l'utilisateur si vous mettez constamment à jour la carte avec de nouvelles annotations.
RocketMan
Pour une raison quelconque, mon annotation userLocation disparaît toujours en utilisant cette méthode. La solution de Victor Van Hee fonctionne pour moi.
Stephen Burns
17

Voici comment supprimer toutes les annotations à l'exception de l'emplacement de l'utilisateur, écrit explicitement car j'imagine que je reviendrai chercher cette réponse:

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;
Victor Van Hee
la source
Merci, Cela a fonctionné pour moi avec copier-coller et supprimer [version locs] et changer mapView en _mapView. Je suivais un excellent tutoriel pour MKDirections ici devfright.com/mkdirections-tutorial et je voulais supprimer la broche après avoir obtenu des instructions. J'ai ajouté le code sous la dernière ligne de cette méthode à la méthode `` clear route ''
Hblegg
mettre à jour supprimer plusieurs - (IBAction) clearRoute: (UIBarButtonItem *) sender {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nul; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> annot dans [_mapView annotations]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Ceci est très similaire à la réponse de Sandip, sauf qu'il ne rajoute pas l'emplacement de l'utilisateur afin que le point bleu ne clignote plus.

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

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

    [self.mapView removeAnnotations:annotations];
}
Chris
la source
11

Vous n'avez pas besoin d'enregistrer de référence à l'emplacement de l'utilisateur. Il suffit de:

[mapView removeAnnotations:mapView.annotations]; 

Et tant que vous avez mapView.showsUserLocationdéfini sur YES, vous aurez toujours l'emplacement de l'utilisateur sur la carte. Les paramètres de cette propriété YESdemandent essentiellement à la vue de la carte de commencer à mettre à jour et à récupérer l'emplacement de l'utilisateur, pour l'afficher sur la carte. D'après les MKMapView.hcommentaires:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
la source
J'ai fini par utiliser ce format: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted le
6

Version Swift:

func removeAllAnnotations() {
    let annotations = mapView.annotations.filter {
        $0 !== self.mapView.userLocation
    }
    mapView.removeAnnotations(annotations)
}
Kosuke Ogawa
la source
6

Swift 3

if let annotations = self.mapView.annotations {
    self.mapView.removeAnnotations(annotations)
}
mckanet
la source
2

Swift 2.0 Simple et le meilleur:

mapView.removeAnnotations(mapView.annotations)
Maselko
la source
0

Pour supprimer un type de sous-classe, vous pouvez faire

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

PlacesAnnotationest une sous-classe deMKAnnotation

Tharak
la source