Comment supprimer toutes les annotations sur un MKMapView


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

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

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;

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

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

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

6

Swift 3

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

2

Swift 2.0 Simple et le meilleur:

mapView.removeAnnotations(mapView.annotations)

0

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

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

PlacesAnnotationest une sous-classe deMKAnnotation

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.