2010-01-25 5 views
25

Je souhaite supprimer toutes les annotations de ma vue sans le point bleu de ma position. Quand j'appelle:Comment supprimer toutes les annotations de MKMapView sans supprimer le point bleu?

[mapView removeAnnotations:mapView.annotations]; 

toutes les annotations sont supprimées.

De quelle manière puis-je vérifier (comme une boucle for sur toutes les annotations) si l'annotation n'est pas l'annotation point bleu?

EDIT (je l'ai résolu à ce sujet):

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, j'ai essayé d'utiliser votre code, et il fonctionne, mais pour une raison quelconque, au lieu d'enlever une broche à un moment, il se débarrasse de 3 ou 2 à la fois. ... qu'est-ce qui se passe avec ça? – skinny123

+0

essayez d'inverser l'interation. Évidemment, enlever un signifie alors que vos indices changent. Retirer de l'arrière. – chrism

+0

duplication possible de [Comment supprimer toutes les annotations de MKMapView à l'exception de l'annotation d'emplacement de l'utilisateur?] (Http://stackoverflow.com/questions/10865088/how-do-i-remove-all-annotations-from-mkmapview-except -le-utilisateur-emplacement-annotati) – nielsbot

Répondre

58

En regardant le MKMapView documentation, il semble que vous avez la propriété des annotations à jouer avec. Il devrait être assez simple à itérer cela et voir ce que les annotations que vous avez:

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

Vous avez également la propriété userLocation qui vous donne l'annotation représentant l'emplacement de l'utilisateur. Si vous passez par les annotations et rappelez-vous tous qui ne sont pas l'emplacement de l'utilisateur, vous pouvez les supprimer en utilisant la méthode 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]; 

Hope this helps,

Sam

+0

Salut merci pour votre astuce Sam !, j'ai également résolu maintenant de cette façon: pour (int i = 0; i <[mapView.les annotations comptent]; i ++) { \t \t if ([[mapView.annotations objectAtIndex: i] isKindOfClass: [classe MyAnnotationClass]]) { [Mapview removeAnnotation: [mapView.annotations objectAtIndex: i]]; \t \t}} \t ..thanks à nouveau .. :) – Mat

+0

C'est une très bonne façon de le faire aussi - j'enlever toutes les annotations, mais vous supprimez uniquement les annotations que vous avez ajouté ce qui est probablement une chose plus sûre à faire. Joli. S – deanWombourne

+1

Mat, juste une pensée: est-ce que ça ne va pas passer une annotation qui est déplacée à la place de celle qui est enlevée? Semble l'annotation après avoir obtenu l'index que le retiré, mais le compteur de i augmente sans pitié. –

31

Si vous comme rapide et simple, il existe un moyen de filtrer un tableau de l'annotation MKUserLocation. Vous pouvez le transmettre dans la fonction removeAnnotations de MKMapView.

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

Je suppose que cela est à peu près la même chose que les filtres manuels affichés ci-dessus, sauf en utilisant un prédicat pour faire le sale boulot.

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

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

     [map removeAnnotation:annotation]; 
    } 
    } 

i modifié comme celui-ci

13

est-il pas plus facile de faire tout ce qui suit:

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

Ceci est la meilleure réponse! –

+1

travaille pour moi, merci. –

1

il est plus facile de le faire ce qui suit:

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

chemin le plus court pour nettoyer toutes les annotations et préserver l'annotation de classe MKUserLocation

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

cela va supprimer l'emplacement de l'utilisateur – nielsbot

0

Swift 3,0

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

reçoit l'erreur messageType '[MGLAnnotation]?' n'est pas conforme au protocole 'Sequence' –

Questions connexes