2017-05-28 6 views
1

J'ai le code suivant, qui a pour but de parcourir toutes les annotations de la vue actuelle de la carte Apple et de mettre à jour leurs coordonnées de localisation.Comment mettre à jour l'emplacement d'un objet MKAnnotation sur un mapView?

for existingMarker in self.mapView.annotations { 

    existingMarker.coordinate.latitude = 12.12121212 
    existingMarker.coordinate.longitude = 14.312121121   
} 

Malheureusement, cela n'est pas autorisé. On me dit que 'coordinate' est une propriété get only. Donc, ce n'est évidemment pas comment je suis censé mettre à jour l'emplacement des annotations MKAnnotation déjà dessinées sur un mapView. Comment puis-je faire ça alors? Plus précisément, je voudrais faire cela et avoir la carte "redessiner" avec les nouvelles coordonnées dès que possible. Je suis sûr que cela doit être possible car il semble être un cas d'utilisation commun.

Répondre

2

Faites votre propre classe MKAnnotation, où (a) coordinate est pas en lecture seule; et où (b) il est dynamic, .: par exemple

class MyAnnotation: NSObject, MKAnnotation { 
    dynamic var coordinate: CLLocationCoordinate2D 
    dynamic var title: String? 
    dynamic var subtitle: String? 

    init(coordinate: CLLocationCoordinate2D, title: String? = nil, subtitle: String? = nil) { 
     self.coordinate = coordinate 
     self.title = title 
     self.subtitle = subtitle 

     super.init() 
    } 
} 

utiliser ensuite qu'au lieu de MKPointAnnotation. De toute évidence, vous devez utiliser un nom plus descriptif que MyAnnotation.

Aussi, lorsque vous les déplacez, vous devriez vraiment les jeter à tout ce que vous avez appelé votre nouvelle classe d'annotation:

for existingMarker in self.mapView.annotations { 
    if let annotation = existingMarker as? MyAnnotation { 
     annotation.coordinate = CLLocationCoordinate2D(latitude: 12.12121212, longitude: 14.312121121) 
    } 
} 

Ou

self.mapView.annotations.flatMap({ $0 as? MyAnnotation}).forEach { 
    $0.coordinate = CLLocationCoordinate2D(latitude: 12.12121212, longitude: 14.312121121) 
} 
0

Je peux vous recommander de supprimer l'annotation et l'ajouter à nouveau avec les nouvelles coordonnées:

self.mapView.removeAnnotation(existingMarker) 

Et puis:

map.addAnnotation(annotation: updatedMarkerWithNewCoordinates)