J'utilise removeAnnotations
pour supprimer mes annotations de mapView
mais pareil, il supprime l'emplacement utilisateur ann. Comment puis-je empêcher cela, ou comment faire revenir l'utilisateur à ann?
NSArray *annotationsOnMap = mapView.annotations;
[mapView removeAnnotations:annotationsOnMap];
Mettre à jour:
Lorsque j'ai essayé avec iOS 9 SDK, l'annotation de l'utilisateur n'est plus supprimée. Vous pouvez simplement utiliser
mapView.removeAnnotations(mapView.annotations)
Réponse historique (pour les applications qui s'exécutent sur iOS avant iOS 9):
Essaye ça:
NSMutableArray * annotationsToRemove = [ mapView.annotations mutableCopy ] ;
[ annotationsToRemove removeObject:mapView.userLocation ] ;
[ mapView removeAnnotations:annotationsToRemove ] ;
EDIT: version rapide
let annotationsToRemove = mapView.annotations.filter { $0 !== mapView.userLocation }
mapView.removeAnnotations( annotationsToRemove )
Pour effacer toutes les annotations de la carte:
[self.mapView removeAnnotations:[self.mapView annotations]];
Pour supprimer les annotations spécifiées de Mapview
for (id <MKAnnotation> annotation in self.mapView.annotations)
{
if (![annotation isKindOfClass:[MKUserLocation class]])
{
[self.mapView removeAnnotation:annotation];
}
}
J'espère que cela peut vous aider.
Pour Swift, vous pouvez simplement utiliser un one-liner:
mapView.removeAnnotations(mapView.annotations)
Edit: Comme nielsbot l'a mentionné, cela supprimera également l'annotation d'emplacement de l'utilisateur, à moins que vous ne l'ayez configurée comme suit:
mapView.showsUserLocation = true
Si votre emplacement utilisateur correspond à la classe MKUserLocation
, utilisez isKindOfClass
pour éviter de supprimer les annotations d'emplacement utilisateur.
if (![annotation isKindOfClass:[MKUserLocation class]]) {
}
Sinon, vous pouvez définir un indicateur pour reconnaître le type de vos annotations dans – mapView:viewForAnnotation:
.
Que diriez-vous d'un filtre NSPredicate
?
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"className != %@", NSStringFromClass(MKUserLocation.class)];
NSArray *nonUserAnnotations = [self.mapView.annotations filteredArrayUsingPredicate:predicate];
[self.mapView removeAnnotations:nonUserAnnotations];
La vie est toujours meilleure avec le filtre NSPredicate
Dans Swift 4.1 :
Normalement, si vous ne souhaitez pas supprimer votreMKUserLocationannotation, vous pouvez simplement exécuter:
self.mapView.removeAnnotations(self.annotations)
.
Cette méthode par défaut ne supprime pas l'annotationMKUserLocationde la liste annotations
.
Toutefois, si vous devez filtrer toutes les annotations à l'exception de la variableMKUserLocation(voir la variable annotationsNoUserLocation
ci-dessous), pour toute autre raison, telle que le centrage sur toutes les annotations sauf l'annotationMKUserLocationpouvez utiliser cette simple extension ci-dessous.
extension MKMapView {
var annotationsNoUserLocation : [MKAnnotation] {
get {
return self.annotations.filter{ !($0 is MKUserLocation) }
}
}
func showAllAnnotations() {
self.showAnnotations(self.annotations, animated: true)
}
func removeAllAnnotations() {
self.removeAnnotations(self.annotations)
}
func showAllAnnotationsNoUserLocation() {
self.showAnnotations(self.annotationsNoUserLocation, animated: true)
}
}