2010-06-12 11 views

Respuesta

231

Sí, aquí es cómo

[mapView removeAnnotations:mapView.annotations] 

Sin embargo, la línea de código anterior eliminará todas las anotaciones mapa "bolos" de el mapa, incluyendo el pasador de la ubicación del usuario "Pin azul". Para eliminar todos los mapas anotaciones y mantener el pasador de la ubicación del usuario en el mapa, hay dos posibles maneras de hacer eso

Ejemplo 1, retener la ubicación del usuario de anotación, retire todos los pines, añadir la ubicación del usuario pasador de vuelta, pero hay un defecto con este enfoque, se hará que el pasador de la ubicación del usuario a parpadear en el mapa, debido a la eliminación de el pasador a continuación, añadir de nuevo

- (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, yo personalmente prefiero para evitar Identificación del retirando el pasador de la ubicación del usuario , 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; 
} 
+1

se relaciona este quitar el usuario ubicación también? ¿Qué ocurre si quiero eliminar todas las anotaciones además de la ubicación del usuario? –

+1

No necesita guardar ninguna referencia a la ubicación del usuario. Lea mi respuesta a continuación para obtener más información. –

17

Aquí es cómo eliminar todas las anotaciones excepto la ubicación del usuario, escrito explícitamente porque imagino que vendrá en busca de esta respuesta de nuevo:

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; 
+0

Gracias, Esto funcionó para mí con copiar y pegar y eliminar [versión de locus] y cambiar mapView a _mapView. Estaba siguiendo un gran tutorial para MKDirections aquí http://www.devfright.com/mkdirections-tutorial y quería eliminar el pin después de obtener instrucciones. Agregué el código debajo de la última línea de ese método a la 'ruta clara' Método – Hblegg

+0

actualización 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]; para (id Annot en [anotaciones _mapView]) { si ([Annot isKindOfClass: [clase MKUserLocation]]) {} else { [locs addObject: Annot]; } } [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; } – Hblegg

35

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

Buena respuesta, mucho más rápido que iterar a través de todas ellas, especialmente si tiene más de un puñado de anotaciones. –

+6

Al quitar una anotación y luego volver a agregarla, hace que el pin parpadee en el mapa. Puede que no sea un gran problema para algunas aplicaciones, pero puede ser molesto para el usuario si constantemente actualiza el mapa con nuevas anotaciones. – RocketMan

+0

Por alguna razón, mi anotación UserLocation siempre desaparece con este método. La solución de Victor Van Hee funciona para mí. –

13

Esto es muy similar a S respuesta de andip, excepto que no vuelve a agregar la ubicación del usuario para que el punto azul no parpadee una y otra vez.

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

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

    [self.mapView removeAnnotations:annotations]; 
} 
+0

adoran las soluciones sin bucles, grreeeeeat !!! –

11

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

[mapView removeAnnotations:mapView.annotations]; 

Y todo el tiempo que tiene mapView.showsUserLocation conjunto de YES, de todas maneras tendrá la ubicación del usuario en el mapa. La configuración de esta propiedad al YES básicamente le pide a la vista del mapa que comience a actualizar y recuperar la ubicación del usuario, para mostrarla en el mapa. De los MKMapView.h comentarios:

// Set to YES to add the user location annotation to the map and start updating its location 
+0

Terminé usando este formato: [self.mapView.removeAnnotations (mapView.annotations)] –

5

versión Swift:

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

Swift 2.0 simple y lo mejor:

mapView.removeAnnotations(mapView.annotations) 
2

Swift 3

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