2017-05-28 2 views
1

Ich habe den folgenden Code, der alle Annotationen in der aktuellen Map Map-Ansicht durchläuft und ihre Standortkoordinaten aktualisiert.Wie aktualisiere ich den Speicherort eines MKAnnotation-Objekts in einem mapView?

for existingMarker in self.mapView.annotations { 

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

Leider ist dies nicht erlaubt. Mir wurde gesagt, dass "Koordinate" eine reine Eigenschaft ist. Das ist natürlich nicht so, wie ich den Standort der Annotationen von MKAnnotation aktualisieren soll, die bereits auf einer mapView gezeichnet wurden. Wie kann ich das dann tun? Speziell möchte ich dies tun und die Karte mit den neuen Koordinaten so schnell wie möglich "neu zeichnen" lassen. Ich bin mir sicher, dass dies möglich sein muss, da es sich um einen üblichen Anwendungsfall handelt.

Antwort

2

Machen Sie Ihre eigene MKAnnotation Klasse, wobei (a) coordinate ist nicht readonly; und wo (b) es dynamic ist, z.B .:

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() 
    } 
} 

Verwenden Sie dann, dass anstelle von MKPointAnnotation. Natürlich sollten Sie einen aussagekräftigeren Namen als MyAnnotation verwenden.

Auch, wenn Sie sie bewegen, sollten Sie wirklich werfen sie, was auch immer Sie Ihre neue Annotation-Klasse genannt:

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

Oder

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

kann ich Sie empfehle die Anmerkung zu löschen und erneut mit den neuen Koordinaten hinzu:

self.mapView.removeAnnotation(existingMarker) 

Und dann:

map.addAnnotation(annotation: updatedMarkerWithNewCoordinates) 
Verwandte Themen