2015-09-29 10 views
18

avevo codice funzionante per rimuovere tutte le annotazioni della mappa con un pulsante, ma dopo il mio aggiornamento per Xcode 7 Sono in esecuzione nell'errore:Come faccio a rimuovere tutte le annotazioni della mappa in rapida 2

Tipo 'MKAnnotation' non lo fa conformarsi alle protocollo 'SequenceType'

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

risposta

40

In Swift 2 annotations viene dichiarato come matrice non opzionale [MKAnnotation] in modo da poter facilmente scrivere

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

senza qualsiasi tipo di casting.

+0

Ha funzionato alla grande! Grazie! – user4812000

13
self.mapView.removeAnnotations(self.mapView.annotations) 

Se non si desidera rimuovere la posizione dell'utente.

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

Nota: Objective-C ora hanno farmaci generici, non è più necessaria fusione degli elementi di matrice 'annotazioni'.

+0

Voglio usare il tuo codice ma dice: inaspettatamente trovato nulla mentre ... so cosa significa, ma non ho idea di quale valore sia nullo. – Lenny1357

0

Il problema è che ci sono due metodi. Uno è removeAnnotation che accetta un oggetto MKAnnotation e l'altro è removeAnnotation che accetta un array di MKAnnotations, nota la "s" alla fine di uno e non dell'altro. Tentando di eseguire il cast da [MKAnnotation], un array su MKAnnotation un singolo oggetto o viceversa manderà in crash il programma. La linea di codice self.mapView.annotations crea una matrice. Quindi, se si utilizza il metodo removeAnnotation, è necessario per indicizzare l'array per un singolo oggetto all'interno della matrice, come illustrato di seguito:

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

Così, è possibile rimuovere le varie annotazioni mantenendo la posizione degli utenti. Dovresti sempre testare il tuo array prima di tentare di rimuovere oggetti da esso, altrimenti è possibile che si verifichi un fuori limite o un errore nullo.

Nota: l'uso del metodo removeAnnotations (con una s) rimuove tutte le annotazioni. Se stai ottenendo un nulla, questo implica che hai una matrice vuota. Puoi verificarlo aggiungendo un'altra istruzione dopo il se, in questo modo;

else{print("empty array")} 
Problemi correlati