2013-01-03 13 views
7

Ich habe eine Mapview, wo die Koordinaten der Annotation ständig aktualisiert werden, aber wenn ich setCoordinate verwende, bewegt sich die Annotation nicht. Wie aktualisiere ich die Anmerkungen, um ihre Koordinaten wiederzugeben?iOS Refresh Annotations auf Kartenansicht

- (void)updateUnits { 

    PFQuery *query = [PFQuery queryWithClassName:@"devices"]; 
    [query whereKeyExists:@"location"]; 
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 

     if (!error) { 

      for (PFObject *row in objects) { 

       PFGeoPoint *geoPoint = [row objectForKey:@"location"]; 
       CLLocationCoordinate2D coord = { geoPoint.latitude, geoPoint.longitude }; 

       for (id<MKAnnotation> ann in mapView.annotations) { 

        if ([ann.title isEqualToString:[row objectForKey:@"deviceid"]]) { 

         [ann setCoordinate:coord]; 

         NSLog(@"latitude is: %f" , coord.latitude); 
         NSLog(@"Is called"); 
         break; 
        } 
        else { 

         //[self.mapView removeAnnotation:ann]; 
        } 
       } 
      } 
     } 
     else { 

     } 
    }]; 
} 
+0

Dies kann durch einfaches Ändern der Koordinaten im Annotation-Objekt erfolgen. Es ist nicht erforderlich, die Annotation zu entfernen und dann der Map hinzuzufügen, damit die Änderung wirksam wird. –

Antwort

14

aktualisiert (die Lösung zu reflektieren):

Ihre eigenen Anmerkungen zu haben und Umsetzung setCoordinate und/oder Probleme verursachen Synthese koordinieren kann.

Quelle: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html

Bisherige Lösung:

Sie können einfach alle die Anmerkungen entfernen und sie dann erneut hinzufügen.

[mapView removeAnnotations:[mapView.annotations]]; 

[mapView addAnnotations:(NSArray *)]; 

oder sie entfernen und erneut hinzufügen, sie eins nach dem anderen:

for (id<MKAnnotation> annotation in mapView.annotations) 
{ 
    [mapView removeAnnotation:annotation]; 
    // change coordinates etc 
    [mapView addAnnotation:annotation]; 
} 
+0

Das ist viel intensiver, wenn Sie einfach ihre Koordinaten ändern können. –

+0

Sind sie eine benutzerdefinierte Anmerkung? Wenn ja, haben Sie die Koordinateneigenschaft überladen? –

+0

Ja, es ist Brauch. Was meinst du damit, die Koordinateneigenschaft zu überladen? –

0

[self.mapView removeAnnotations:self.mapView.annotations] mit Versuchen:

- (void)viewDidAppear:(BOOL)animated 
{ 

[super viewDidAppear:animated]; 

[self.mapView removeAnnotations:self.mapView.annotations]; 

PFQuery *query = [PFQuery queryWithClassName:@"caches"]; 

[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) 
{ 
    for (PFObject *comment in comments) 
    { 
     NSString *tit = comment[@"titulo"]; 
     NSString *lat = comment[@"latitud"]; 
     NSString *lon = comment[@"longitud"]; 

     float latFloat = [lat floatValue]; 
     float lonFloat = [lon floatValue]; 

     CLLocationCoordinate2D Pin; 
     Pin.latitude = latFloat; 
     Pin.longitude = lonFloat; 
     MKPointAnnotation *annotationPoint = [[MKPointAnnotation alloc]init]; 
     annotationPoint.coordinate = Pin; 
     annotationPoint.title = tit; 

     [self.mapView addAnnotation:annotationPoint]; 

    } 

}]; 
} 
9

das Add-Anmerkung zu den Haupt-Thread ab Werk eher dann versuchen, zu modifizieren, die UI auf einem Hintergrundthread

dispatch_async(dispatch_get_main_queue()) { 
    self.mapView.addAnnotation(annotation) 
} 
+1

Danke! Dies half mir bei meinem Problem, dass das MapView nicht mit meinen hinzugefügten Annotationen aktualisiert wurde, es sei denn, ich habe die Map manuell verschoben. –

4

Swift 3.0 Version von Nathans Antwort (danke Nathan):

DispatchQueue.main.async { 
    mapView.addAnnotation(annotation) 
} 

Randbemerkung, die Antwort von Nathan sollte weit mehr upvotes haben. Ich brauchte diese Hilfe beim Entfernen einer Anmerkung, das gleiche Problem existiert und wird behoben, indem das Update an die Hauptwarteschlange gesendet wird.

+1

Das ist die Antwort, bis Apple eine bessere Lösung hat! –