Cómo eliminar todas las anotaciones en un MKMapView

Respuestas:

246

Si, asi es como

[mapView removeAnnotations:mapView.annotations]

Sin embargo, la línea de código anterior eliminará todas las anotaciones de mapa "PINS" del mapa, incluido el pin de ubicación del usuario "Pin azul". Para eliminar todas las anotaciones del mapa y mantener el marcador de ubicación del usuario en el mapa, hay dos formas posibles de hacerlo

Ejemplo 1, conservar la anotación de ubicación del usuario, eliminar todos los pines, volver a agregar el pin de ubicación del usuario, pero hay una falla con este enfoque, hará que el pin de ubicación del usuario parpadee en el mapa, debido a que se quita el pin y luego se agrega espalda

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

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

Ejemplo 2, personalmente prefiero evitar eliminar el pin de usuario de ubicación en primer lugar,

- (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
fuente
1
¿Esto también elimina la ubicación del usuario? ¿Qué pasa si quiero eliminar todas las anotaciones además de la ubicación del usuario?
Kevin Mendoza
1
No es necesario guardar ninguna referencia a la ubicación del usuario. Lea mi respuesta a continuación para obtener más información.
Aviel Gross
36

Esta es la forma más sencilla de hacerlo:

-(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
fuente
Buena respuesta, mucho más rápido que iterar a través de todos ellos, especialmente si tiene más de un puñado de anotaciones.
Matthew Frederick
6
Quitar una anotación y luego volver a agregarla, hace que el marcador parpadee en el mapa. Puede que no sea un gran problema para algunas aplicaciones, pero puede ser molesto para el usuario si actualiza constantemente el mapa con nuevas anotaciones.
RocketMan
Por alguna razón, mi anotación userLocation siempre desaparece con este método. La solución de Victor Van Hee funciona para mí.
Stephen Burns
17

Aquí se explica cómo eliminar todas las anotaciones, excepto la ubicación del usuario, escritas explícitamente porque imagino que vendré a buscar esta respuesta nuevamente:

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
fuente
Gracias, esto funcionó para mí con copiar y pegar y eliminar [liberación de locomotoras] y cambiar mapView a _mapView. Estaba siguiendo un gran tutorial para MKDirections aquí devfright.com/mkdirections-tutorial y quería quitar el pin después de obtener instrucciones. Agregué el código debajo de la última línea de ese método al método de 'ruta clara'
Hblegg
actualizar eliminar múltiples - (IBAction) clearRoute: (UIBarButtonItem *) remitente {self.destinationLabel.text = nil; self.distanceLabel.text = nil; self.steps.text = nil; [self.mapView removeOverlay: routeDetails.polyline]; NSMutableArray * locs = [[NSMutableArray alloc] init]; for (id <MKAnnotation> anotar en [_mapView anotaciones]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg
13

Esto es muy similar a la respuesta de Sandip, excepto que no vuelve a agregar la ubicación del usuario, por lo que el punto azul no parpadea de nuevo.

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

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

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

No es necesario guardar ninguna referencia a la ubicación del usuario. Todo lo que se necesita es:

[mapView removeAnnotations:mapView.annotations]; 

Y siempre que lo haya mapView.showsUserLocationconfigurado YES, seguirá teniendo la ubicación del usuario en el mapa. La configuración de esta propiedad YESbásicamente le pide a la vista del mapa que comience a actualizar y obtener la ubicación del usuario, para mostrarla en el mapa. De los MKMapView.hcomentarios:

// Set to YES to add the user location annotation to the map and start updating its location
Aviel Gross
fuente
Terminé usando este formato: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted
6

Versión rápida:

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

Swift 3

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

Swift 2.0 Simple y lo mejor:

mapView.removeAnnotations(mapView.annotations)
Maselko
fuente
0

Para eliminar un tipo de subclase, puede hacer

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

donde PlacesAnnotationes una subclase deMKAnnotation

Tharak
fuente