web-dev-qa-db-fra.com

Comment supprimer toutes les annotations de MKMapView sans supprimer le point bleu?

Je souhaite supprimer toutes les annotations de ma carte sans le point bleu de ma position. Quand j'appelle:

[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 en point bleu?

EDIT(j'ai résolu avec ça):

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

En regardant la documentation MKMapView , il semble que vous ayez la propriété annotations pour jouer. Il devrait être assez simple de parcourir cela et de voir quelles annotations vous avez:

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

Vous disposez également de la propriété userLocation qui vous donne l'annotation représentant l'emplacement de l'utilisateur. Si vous parcourez les annotations et vous souvenez de toutes les adresses autres que l'emplacement de l'utilisateur, vous pouvez les supprimer à l'aide de 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];

J'espère que cela t'aides,

Sam

58
deanWombourne

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

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

Je suppose que c'est à peu près la même chose que les filtres manuels affichés ci-dessus, à l'exception de l'utilisation d'un prédicat pour faire le sale boulot.

31
Sebastian Bean

N’est-il pas plus simple de faire 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];
13
Mikael

moyen le plus rapide de nettoyer toutes les annotations et de préserver les annotations de la classe MKUserLocation

[self.mapView removeAnnotations:self.mapView.annotations];
8
DazChong
for (id annotation in map.annotations) {
    NSLog(@"annotation %@", annotation);

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

        [map removeAnnotation:annotation];
    }
    }

j'ai modifié comme ça 

6
chings228

il est plus facile de 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];
1
kunalg

Pour Swift 3.0

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