Come eliminare tutte le annotazioni su un MKMapView


Risposte:


246

Sì, ecco come

[mapView removeAnnotations:mapView.annotations]

Tuttavia, la riga di codice precedente rimuoverà dalla mappa tutte le annotazioni "PIN" della mappa, compreso il segnaposto della posizione dell'utente "Blue Pin". Per rimuovere tutte le annotazioni sulla mappa e mantenere il segnaposto della posizione dell'utente sulla mappa, ci sono due modi possibili per farlo

Esempio 1, conservare l'annotazione della posizione dell'utente, rimuovere tutti i pin, aggiungere nuovamente il pin della posizione dell'utente, ma c'è un difetto con questo approccio, farà lampeggiare il pin della posizione dell'utente sulla mappa, a causa della rimozione del pin e dell'aggiunta indietro

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

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

Esempio 2, personalmente preferisco evitare di rimuovere il pin dell'utente della posizione in primo luogo,

- (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
questo rimuove anche la posizione dell'utente? cosa succede se voglio rimuovere tutte le annotazioni oltre alla posizione dell'utente?
kevin Mendoza

1
Non è necessario salvare alcun riferimento alla posizione dell'utente. Leggi la mia risposta qui sotto per maggiori informazioni.
Aviel Gross

36

Ecco il modo più semplice per farlo:

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

Buona risposta, molto più veloce dell'iterazione di tutte, soprattutto se hai più di una manciata di annotazioni.
Matthew Frederick

6
Rimuovendo un'annotazione e poi aggiungendola di nuovo, il segnaposto lampeggia sulla mappa. Potrebbe non essere un grosso problema per alcune app, ma può essere fastidioso per l'utente se aggiorni costantemente la mappa con nuove annotazioni.
RocketMan

Per qualche ragione, la mia annotazione userLocation scompare sempre usando questo metodo. La soluzione di Victor Van Hee funziona per me.
Stephen Burns

17

Ecco come rimuovere tutte le annotazioni tranne la posizione dell'utente, scritta esplicitamente perché immagino che tornerò a cercare questa risposta:

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;

Grazie, ha funzionato per me con copia e incolla, rimozione di [locs release] e modifica di mapView in _mapView. Stavo seguendo un ottimo tutorial per MKDirections qui devfright.com/mkdirections-tutorial e volevo rimuovere il pin dopo aver ottenuto le indicazioni. Ho aggiunto il codice sotto l'ultima riga di quel metodo al metodo 'clear route'
Hblegg

aggiornamento rimuovere più - (IBAction) clearRoute: (UIBarButtonItem *) sender {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> annot in [_mapView annotations]) {if ([annot isKindOfClass: [MKUserLocation class]]) {} else {[locs addObject: annot]; }} [_mapView removeAnnotations: locs]; [_mapView removeOverlays: _mapView.overlays]; }
Hblegg

13

Questo è molto simile alla risposta di Sandip, tranne per il fatto che non aggiunge nuovamente la posizione dell'utente, quindi il punto blu non lampeggia di nuovo.

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

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

    [self.mapView removeAnnotations:annotations];
}

11

Non è necessario salvare alcun riferimento alla posizione dell'utente. Tutto ciò che serve è:

[mapView removeAnnotations:mapView.annotations]; 

E finché hai mapView.showsUserLocationimpostato YES, avrai ancora la posizione dell'utente sulla mappa. Le impostazioni di questa proprietà su YESrichiedono fondamentalmente la visualizzazione della mappa per avviare l'aggiornamento e il recupero della posizione dell'utente, per mostrarla sulla mappa. Dai MKMapView.hcommenti:

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

Ho finito per usare questo formato: [self.mapView.removeAnnotations (mapView.annotations)]
Edward Hasted

6

Versione rapida:

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 Semplice e il migliore:

mapView.removeAnnotations(mapView.annotations)

0

Per rimuovere un tipo di sottoclasse puoi fare

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

dove PlacesAnnotationè una sottoclasse diMKAnnotation

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.