xcode - ¿Cómo elimino todas las anotaciones de mapas en swift 2?
mapkit swift2 (3)
Tuve un código de trabajo para eliminar todas las anotaciones del mapa con un botón, pero después de mi actualización a xcode 7, me encuentro con el error:
El tipo ''MKAnnotation'' no cumple con el protocolo ''SequenceType''
if let annotations = (self.mapView.annotations as? MKAnnotation){
for _annotation in annotations {
if let annotation = _annotation as? MKAnnotation {
self.mapView.removeAnnotation(annotation)
}
}
}
El problema es que hay dos métodos. Una es removeAnnotation, que toma un objeto MKAnnotation, y la otra es removeAnnotations, que toma una matriz de MKAnnotations, note la "s" al final de una y no la otra. Al intentar emitir desde [MKAnnotation]
, una matriz a MKAnnotation
un solo objeto o viceversa, bloqueará el programa. La línea de código self.mapView.annotations crea una matriz. Por lo tanto, si está utilizando el método removeAnnotation, debe indexar la matriz para un solo objeto dentro de la matriz, como se ve a continuación:
let previousAnnotations = self.mapView.annotations
if !previousAnnotations.isEmpty{
self.mapView.removeAnnotation(previousAnnotations[0])
}
Por lo tanto, puede eliminar varias anotaciones mientras mantiene la ubicación de los usuarios. Siempre debe probar su matriz antes de intentar eliminar objetos de ella, de lo contrario, es posible que obtenga un error fuera de límites o nulo.
Nota: el uso del método removeAnnotations (con una s) elimina todas las anotaciones. Si está obteniendo un valor nulo, eso implica que tiene una matriz vacía. Puede verificarlo agregando una instrucción else después de if, like so;
else{print("empty array")}
En Swift 2, las annotations
se declaran como una matriz no opcional [MKAnnotation]
para que pueda escribir fácilmente
let allAnnotations = self.mapView.annotations
self.mapView.removeAnnotations(allAnnotations)
Sin ningún tipo de fundición.
self.mapView.removeAnnotations(self.mapView.annotations)
Si no quieres eliminar la ubicación del usuario.
self.mapView.annotations.forEach {
if !($0 is MKUserLocation) {
self.mapView.removeAnnotation($0)
}
}
Nota: Objective-C ahora tiene genéricos, ya no es necesario convertir los elementos de la matriz de ''anotaciones''.