web-dev-qa-db-fra.com

Comment supprimer toutes les annotations sur un MKMapView

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

98
kevin Mendoza

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 le code "Blue Pin" de l'emplacement de l'utilisateur. Pour supprimer toutes les annotations sur la carte et conserver l'épingle d'emplacement de l'utilisateur sur la carte, il existe deux façons de le faire.

Exemple 1, conservez l'annotation d'emplacement utilisateur, supprimez toutes les punaises, ajoutez la broche d'emplacement utilisateur en arrière, mais cette approche présente un défaut qui entraînera le clignotement de la broche d'emplacement utilisateur sur la carte, car elle a été supprimée puis ajoutée. retour

- (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 retirer le code PIN d’emplacement d’utilisateur,

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

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];
}
36
Sandip Sarkar

Voici comment supprimer toutes les annotations à l'exception de l'emplacement de l'utilisateur, explicitement écrit, 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;
17
Victor Van Hee

Ceci est très similaire à la réponse de Sandip, à la différence qu’il ne rajoute pas l’emplacement de l’utilisateur, 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];
}
13
Chris

Vous n'avez pas besoin de sauvegarder de référence à l'emplacement de l'utilisateur. Tout ce qui est nécessaire est:

[mapView removeAnnotations:mapView.annotations]; 

Et aussi longtemps que vous avez mapView.showsUserLocation réglé sur YES, vous aurez toujours l'emplacement de l'utilisateur sur la carte. Définit cette propriété sur YES demande à la vue Carte de commencer à mettre à jour et à récupérer la localisation de l'utilisateur, afin de l'afficher sur la carte. Du MKMapView.h commentaires:

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

Version rapide:

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

Swift 3

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

Swift 2.0 Simple et le meilleur:

mapView.removeAnnotations(mapView.annotations)
2
Maselko

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

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

PlacesAnnotation est une sous-classe de MKAnnotation

0
Tharak