2010-01-25 11 views
25

Vorrei rimuovere tutte le annotazioni dal mio mapview senza il punto blu della mia posizione. Quando chiamo:Come rimuovere tutte le annotazioni da MKMapView senza rimuovere il punto blu?

[mapView removeAnnotations:mapView.annotations]; 

tutte le annotazioni vengono rimosse.

In che modo è possibile controllare (come un ciclo for su tutte le annotazioni) se l'annotazione non è l'annotazione del punto blu?

EDIT (ho risolto con questo):

for (int i =0; i < [mapView.annotations count]; i++) { 
    if ([[mapView.annotations objectAtIndex:i] isKindOfClass:[MyAnnotationClass class]]) {      
     [mapView removeAnnotation:[mapView.annotations objectAtIndex:i]]; 
     } 
    } 
+0

Hey Mat, ho provato ad utilizzare il proprio codice, e funziona, anche se per qualche ragione, invece di rimozione di un perno in un momento in cui si libera di 3 o 2 alla volta. ...cosa succede con quello? – skinny123

+0

prova a invertire l'interation. Ovviamente, rimuoverne uno significa che i tuoi indici stanno cambiando. Rimuovi dalla parte posteriore. – chrism

+0

possibile duplicato di [Come rimuovere tutte le annotazioni da MKMapView eccetto l'annotazione sulla posizione dell'utente?] (Http://stackoverflow.com/questions/10865088/how-do-i-remove-all-annotations-from-mkmapview-except -the-user-location-annotati) – nielsbot

risposta

58

Guardando il MKMapView documentation, sembra che si ha la proprietà annotazioni con cui giocare. Dovrebbe essere abbastanza semplice da scorrere questo e vedere che cosa avete annotazioni:

for (id annotation in myMap.annotations) { 
    NSLog(@"%@", annotation); 
} 

si ha anche la proprietà userLocation che vi dà l'annotazione che rappresenta la posizione dell'utente. Se si passa attraverso le annotazioni e ricordare tutti loro, che non sono la posizione dell'utente, è possibile rimuoverli utilizzando il metodo removeAnnotations::

NSInteger toRemoveCount = myMap.annotations.count; 
NSMutableArray *toRemove = [NSMutableArray arrayWithCapacity:toRemoveCount]; 
for (id annotation in myMap.annotations) 
    if (annotation != myMap.userLocation) 
     [toRemove addObject:annotation]; 
[myMap removeAnnotations:toRemove]; 

Spero che questo aiuti,

Sam

+0

hi grazie per il tuo trucco Sam !, ho anche ora risolto in questo modo: per (int i = 0; i <[mapView.le annotazioni contano]; i ++) { \t \t if ([[mapView.annotations objectAtIndex: i] isKindOfClass: [class MyAnnotationClass]]) { [MapView removeAnnotation: [mapView.annotations objectAtIndex: i]]; \t \t}} \t ..thanks nuovo .. :) – Mat

+0

Questo è un buon modo di fare troppo - sto rimuovendo tutte le annotazioni, ma si sta rimuovendo solo le annotazioni che hai aggiunto che è probabilmente una cosa più sicura da fare. Ben fatto. S – deanWombourne

+1

Mat, solo un pensiero: non salterà quell'annotazione che viene spostata al posto di quella che viene rimossa? Sembra che l'annotazione dopo avrebbe ottenuto l'indice di quello rimosso, ma il contatore i aumenta senza pietà. –

31

Se come veloce e semplice, c'è un modo per filtrare una matrice dell'annotazione MKUserLocation. Puoi passarlo nella funzione removeAnnotations: MKMapView.

[_mapView.annotations filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"!(self isKindOfClass: %@)", [MKUserLocation class]]]; 

Suppongo che questo è più o meno lo stesso come i filtri manuali postato sopra, ad eccezione utilizzando un predicato per fare il lavoro sporco.

6
for (id annotation in map.annotations) { 
    NSLog(@"annotation %@", annotation); 

    if (![annotation isKindOfClass:[MKUserLocation class]]){ 

     [map removeAnnotation:annotation]; 
    } 
    } 

ho modificato in questo modo

13

Non è più facile di fare proprio il seguente:

//copy your annotations to an array 
    NSMutableArray *annotationsToRemove = [[NSMutableArray alloc] initWithArray: mapView.annotations]; 
//Remove the object userlocation 
    [annotationsToRemove removeObject: mapView.userLocation]; 
//Remove all annotations in the array from the mapView 
    [mapView removeAnnotations: annotationsToRemove]; 
    [annotationsToRemove release]; 
+5

Questa è la migliore risposta! –

+1

funziona per me, grazie. –

1

più facile semplicemente effettuare le seguenti operazioni:

NSMutableArray *annotationsToRemove = [NSMutableArray arrayWithCapacity:[self.mapView.annotations count]]; 
    for (int i = 1; i < [self.mapView.annotations count]; i++) { 
     if ([[self.mapView.annotations objectAtIndex:i] isKindOfClass:[AddressAnnotation class]]) { 
      [annotationsToRemove addObject:[self.mapView.annotations objectAtIndex:i]]; 
      [self.mapView removeAnnotations:annotationsToRemove]; 
     } 
    } 

[self.mapView removeAnnotations:annotationsToRemove]; 
8

via più breve per pulire tutte le annotazioni e conservare l'annotazione della classe MKUserLocation

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

questo rimuoverà la posizione dell'utente – nielsbot

0

per SWIFT 3,0

for annotation in self.mapView.annotations { 
    if let _ = annotation as? MKUserLocation { 
     // keep the user location 
    } else { 
     self.mapView.removeAnnotation(annotation) 
    } 
} 
+0

riceve messaggio di errore Tipo "[MGLAnnotation]?" non è conforme al protocollo "Sequence" –

Problemi correlati