2010-01-25 21 views
25

Me gustaría eliminar todas las anotaciones de mi vista de mapa sin el punto azul de mi posición. Cuando llamo:¿Cómo eliminar todas las anotaciones de MKMapView sin quitar el punto azul?

[mapView removeAnnotations:mapView.annotations]; 

todas las anotaciones se eliminan.

¿De qué manera puedo verificar (como un bucle for en todas las anotaciones) si la anotación no es la anotación de punto azul?

EDITAR (He resuelto con esto):

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, He intentado utilizar su código, y funciona, aunque por alguna razón en lugar de la eliminación de un pasador a la vez que se deshace de 3 o 2 a la vez. ...¿Que pasa con eso? – skinny123

+0

intente invertir la interacción. Obviamente, eliminar uno significa que sus índices están cambiando. Retire de la parte posterior. – chrism

+0

posible duplicado de [¿Cómo elimino todas las anotaciones de MKMapView excepto la anotación de ubicación del usuario?] (Http://stackoverflow.com/questions/10865088/how-do-i-remove-all-annotations-from-mkmapview-except -the-user-location-annotati) – nielsbot

Respuesta

58

Mirando el MKMapView documentation, parece como que tiene la propiedad anotaciones para jugar. Debe ser bastante fácil de recorrer a través de este y ver lo anotaciones tiene:

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

También tienen la propiedad userLocation que le da la anotación que representa la ubicación del usuario. Si vas a través de las anotaciones y recordar a todos ellos que no son la ubicación del usuario, a continuación, puede eliminarlos mediante el removeAnnotations: método:

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

Espero que esto ayude,

Sam

+0

hola gracias por su truco Sam !, también he resuelto de esta manera: para (int i = 0; i <[mapView.las anotaciones cuentan]; i ++) { \t \t si ([[mapView.annotations objectAtIndex: i] isKindOfClass: [clase MyAnnotationClass]]) { [MapView removeAnnotation: [mapView.annotations objectAtIndex: i]]; \t \t}} \t ..thanks nuevo .. :) – Mat

+0

Esa es una muy buena manera de hacerlo también - estoy quitando todas las anotaciones pero estás eliminando sólo las anotaciones que ha añadido que es probablemente una cosa más segura que hacer Buena esa. S – deanWombourne

+1

Mat, solo una idea: ¿no se saltará una anotación que se mueve en lugar de una que se elimina? Parece que la anotación después de obtener el índice que el eliminado tenía, pero el contador I aumenta sin piedad. –

31

si como rápido y simple, hay una manera de filtrar una matriz de la anotación MKUserLocation. Puede pasar esto a la función removeAnnotations de MKMapView.

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

Asumo que esto es más o menos lo mismo que los filtros manuales publicados anteriormente, excepto el uso de un predicado a hacer el trabajo sucio.

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

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

     [map removeAnnotation:annotation]; 
    } 
    } 

i modificada, como

13

¿No es más fácil simplemente hacer lo siguiente:

//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

¡Esta es la mejor respuesta! –

+1

funciona para mí, gracias. –

1

que sea más fácil simplemente hacer lo siguiente:

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

camino más corto para limpiar todas las anotaciones y preservar la anotación de la clase MKUserLocation

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

esto eliminará la ubicación del usuario – nielsbot

0

para SWIFT 3,0

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

recibe mensaje de error Tipo '[MGLAnnotation]?' no se ajusta al protocolo 'Secuencia' –

Cuestiones relacionadas