2013-01-03 15 views
7

Mam widok mapy, w którym współrzędne adnotacji są ciągle aktualizowane, ale kiedy używam funkcji setCoordinate, adnotacja nie porusza się. Jak odświeżyć adnotacje, aby odzwierciedlić ich współrzędne?Adnotacje odświeżania iOS na widoku mapy

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

Można to zrobić po prostu zmieniając współrzędne w obiekcie adnotacji. Nie wymaga usunięcia adnotacji, a następnie dodania jej do mapy, aby zmiana zaczęła obowiązywać. –

Odpowiedz

14

Poprawiony (w celu odzwierciedlenia rozwiązania):

uwzględniając swoje własne adnotacje i wdrażaniu setCoordinate i/lub syntezy współrzędnych może powodować problemy.

Źródło: http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/LocationAwarenessPG/AnnotatingMaps/AnnotatingMaps.html

Poprzednie rozwiązanie:

można po prostu usunąć wszystkie adnotacje, a następnie ponownie je dodać.

[mapView removeAnnotations:[mapView.annotations]]; 

[mapView addAnnotations:(NSArray *)]; 

lub usunąć i ponownie dodać je pojedynczo:

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

Jest to o wiele bardziej intensywne, kiedy można po prostu zmienić ich współrzędne. –

+0

Czy są one adnotacją niestandardową? Jeśli tak, czy przeciąłeś właściwość współrzędnych? –

+0

Tak, jest niestandardowy. Co masz na myśli przez przeciążenie właściwości współrzędnych? –

0

Użyj [self.mapView removeAnnotations:self.mapView.annotations]:

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

wysyłce adnotacji dodać do głównego wątku, a następnie mogą być modyfikowane interfejs użytkownika w wątku tła:

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

Dzięki! Pomogło mi to z moim problemem, że MapView nie zaktualizował moich dodanych adnotacji, chyba że ręcznie przeniosłem mapę. –

4

Swift 3.0 wersja odpowiedzi Nathana (dziękuję Nathana):

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

marginesie, odpowiedź Nathana powinny mieć znacznie więcej upvotes. Naprawdę potrzebowałem tej pomocy przy usuwaniu adnotacji, ten sam problem istnieje i został naprawiony przez wysłanie aktualizacji do głównej kolejki.

+1

To jest odpowiedź, dopóki Apple nie ma lepszego rozwiązania! –

Powiązane problemy