2011-01-15 6 views
0

Ich habe ein Problem mit den Callout-Informationen einer ziehbaren Annotation: Ich verwende einen MKReverseGeocoder, um die Adresse der Koordinaten zu erhalten, die der Annotationsposition entsprechen.Draggable Annotation mit iOS: Callout Info Update

Aber es gibt etwas, das ich nicht kontrollieren kann: Jedes Mal, wenn die ziehbare Annotation gelöscht wird, erscheinen die Callout-Informationen. Sehr oft hatte der MKReverseGeocoder keine Zeit, die Adressinformationen zu aktualisieren, bevor dies geschah. In diesen üblichen Fällen zeigt das Annotation-Callout die Adressinformationen, die den vorherigen Koordinaten der Annotation entsprechen. Hier

ist der Code:

1) Delegate-Methode aufgerufen, wenn Anmerkung fallen gelassen wird:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)annotationView didChangeDragState:(MKAnnotationViewDragState)newState fromOldState:(MKAnnotationViewDragState)oldState{ 
     if (oldState == MKAnnotationViewDragStateDragging) { 
      MKReverseGeocoder *reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate:annotationView.annotation.coordinate]; 
      reverseGeocoder.delegate = self; 
      [reverseGeocoder start]; 
      while (reverseGeocoder.querying) { 
       [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
      } 
      [reverseGeocoder release]; 
     } 
    } 

2) Delegate-Methode aufgerufen, wenn reverseGeocoder eine Antwort findet:

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark { 
    NSString *newSubtitle = [NSString stringWithFormat:@"%@ %@, %@ %@, %@",placemark.subThoroughfare,placemark.thoroughfare,placemark.postalCode,placemark.locality, placemark.country]; 
    Grocery *draggableGrocery = [myMapView.annotations objectAtIndex:0]; 
    draggableGrocery.address = newSubtitle; 
    self.addressNewGrocery = newSubtitle; 
} 

Jede Idee ?

Danke!

Antwort

0

Ich sollte die gleiche Frage stellen, ich habe seit dem gleichen Thema seit gestern gesucht.


UPDATE:


ich nur einen Weg, und ich bin mir nicht sicher, ob es das richtige ist. Zu wissen, dass ich eine MKAnnotation Unterklasse genannt selectedAnnotation haben, habe ich einfach abgewählt, ausgewählt dieses Objekt dann, nachdem ich den neuen Titel in der revereseGeocoder bekam: didFindPlacemark Funktion:

[mapView deselectAnnotation:selectedAnnotation animated:NO]; 
[mapView selectAnnotation:selectedAnnotation animated:NO]; 

für Ihren Fall sollte Ihr Code wie folgt aussehen :

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark { 
    NSString *newSubtitle = [NSString stringWithFormat:@"%@ %@, %@ %@, %@",placemark.subThoroughfare,placemark.thoroughfare,placemark.postalCode,placemark.locality, placemark.country]; 
    Grocery *draggableGrocery = [myMapView.annotations objectAtIndex:0]; 
    draggableGrocery.address = newSubtitle; 
    self.addressNewGrocery = newSubtitle; 
    // add the following lines [I assumed that draggableGrocery [Grocery class] is a subclass of MKAnnotation] 
    [mapView deselectAnnotation:draggableGrocery animated:NO]; 
    [mapView selectAnnotation:draggableGrocery animated:NO]; 
} 
+0

Dank Noor das funktioniert. Es ist wahrscheinlich nicht die eleganteste Lösung, da das alte Callout auftaucht und dann fast sofort verschwindet, aber es ist besser, dass die Informationen nicht aktualisiert werden. Etwas Seltsames: Ich habe versucht, diese Methoden zum Auswählen und Abwählen in anderen Delegatfunktionen wie - (void) mapView zu verwenden: (MKMapView *) mapView-AnnotationView: (MKAnnotationView *) annotationView didChangeDragState: (MKAnnotationViewDragState) newState vonOldState: (MKAnnotationViewDragState) oldState; aber es hatte keinen Effekt! Weißt du, warum ? – Johanisma

+1

Ja, ich stimme zu, dass meine Lösung nicht die beste ist! Ich postete tatsächlich eine schlechtere Lösung, dann bearbeitete ich die Antwort^_ ^, ich entfernte die Annotation selbst, fügte sie dann aus der mapView hinzu und wählte sie aus ... Nun, Sie können nicht das Gleiche machen didChangeDragState-Methode !! weil einfach die Callout Info noch nicht geändert wurde !! sie wurden nur in der didFindPlacemark-Methode geändert;) –

0

Eine weitere Option ist annotationView.canShowCallout = NO nur zu setzen, bevor die Rückwärts Geocoder starten, und dann die Fahne wieder auf JA, wenn Sie fertig.