web-dev-qa-db-fra.com

Comment supprimer toutes les annotations de carte dans Swift 2

J'avais du code de travail pour supprimer toutes les annotations de carte avec un bouton, mais après ma mise à jour vers xcode 7, je rencontre l'erreur:

Le type 'MKAnnotation' n'est pas conforme au protocole 'SequenceType'

if let annotations = (self.mapView.annotations as? MKAnnotation){
    for _annotation in annotations {
        if let annotation = _annotation as? MKAnnotation {
            self.mapView.removeAnnotation(annotation)
        }
    }
}
25
user4812000

In Swift 2 annotations est déclaré comme tableau non facultatif [MKAnnotation] pour écrire facilement

let allAnnotations = self.mapView.annotations
self.mapView.removeAnnotations(allAnnotations)

sans aucune coulée de type.

61
vadian
self.mapView.removeAnnotations(self.mapView.annotations)

Si vous ne souhaitez pas supprimer l'emplacement de l'utilisateur.

self.mapView.annotations.forEach {
  if !($0 is MKUserLocation) {
    self.mapView.removeAnnotation($0)
  }
}

Remarque: Objective-C a désormais des génériques, il n'est plus nécessaire de transtyper les éléments du tableau 'annotations'.

19
Daniel

Le problème est qu'il existe deux méthodes. L'un est removeAnnotation qui prend un objet MKAnnotation, et l'autre est removeAnnotations qui prend un tableau de MKAnnotations, notez le "s" à la fin de l'un et pas l'autre. Tentative de caster à partir de [MKAnnotation], un tableau pour MKAnnotation un seul objet ou vice versa plantera le programme. La ligne de code self.mapView.annotations crée un tableau. Ainsi, si vous utilisez la méthode removeAnnotation, vous devez indexer le tableau pour un seul objet dans le tableau, comme indiqué ci-dessous:

let previousAnnotations = self.mapView.annotations
if !previousAnnotations.isEmpty{
  self.mapView.removeAnnotation(previousAnnotations[0])
}

Ainsi, vous pouvez supprimer diverses annotations tout en conservant l'emplacement des utilisateurs. Vous devez toujours tester votre tableau avant d'essayer de supprimer des objets de celui-ci, sinon il peut y avoir une erreur hors limites ou nulle.

Remarque: l'utilisation de la méthode removeAnnotations (avec un s) supprime toutes les annotations. Si vous obtenez un nil, cela implique que vous avez un tableau vide. Vous pouvez le vérifier en ajoutant une instruction else après le if, comme ceci;

    else{print("empty array")}
1
ZaneMan