2012-06-05 16 views
5

Mam tablicę zawierającą ponad 200 obiektów i próbuję wykonać pętlę przez każdy z nich.Adnotacje widoku mapy z różnymi kolorami pinów

Każdy obiekt będzie miał pole Tak/Nie i chcę wyświetlić inny kolorowy znacznik zależny od tej wartości tak/nie.

Z tego, co widzę, dzieje się, że moja pętla przechodzi najpierw przez każdy obiekt, a następnie wszystkie adnotacje są dodawane na końcu dla każdego obiektu.

Ponieważ wykonuję kontrolę w obrębie mojej pętli przez tablicę przy wartości yes no, gdy cała adnotacja jest dodana do mojej mapy, użyje ona wartości yes/no z ostatniego obiektu w tablicy, gdy przejdzie do wykresu dla wszystkich.

Jak mogę to zrobić, aby znacznik był różny w zależności od wartości tak/nie dla każdego elementu?

Mój kod jest

for (i = 0; i < [appDelegate.itemArray count]; i++) { 
     item_details *tempObj = [appDelegate.itemArray objectAtIndex:i]; 
     location.latitude = [tempObj.lat floatValue]; 
     location.longitude = [tempObj.lon floatValue]; 
     current_yesno = tempObj.yesno; 
     MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc]initWithTitle:tempObj.name andCoordinate:location]; 
     [self.mapView addAnnotation:newAnnotation]; 
     [newAnnotation release];    
      } 

z mojego kodu adnotacji następująco

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{ 

    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"]; 

if(current_yesno == YES){ 
    annView.pinColor = MKPinAnnotationColorGreen; 
} 
else 
{ 
    annView.pinColor = MKPinAnnotationColorRed; 
} 
    annView.animatesDrop=NO; 
    annView.canShowCallout = YES; 
    annView.calloutOffset = CGPointMake(-5, 5); 
    return annView; 

} 

i current_yesno jest zadeklarowane w moim pliku .h.

Odpowiedz

8

Sposób viewForAnnotation delegat niekoniecznie jest wywoływana natychmiast po wykonaniu addAnnotation i może być również zwołane w innym czasie przez widoku mapy, kiedy potrzebuje, aby uzyskać widok na adnotacją (natomiast kod robi coś zupełnie innego).

Nie można więc polegać na wartości synchronizacji ivar z jakimś kodem poza tą metodą delegata.

Zamiast dodać właściwość yesno do klasy zwyczaj MapViewAnnotation, ustawić go podczas tworzenia adnotacji, a następnie uzyskać dostęp do jego wartości w viewForAnnotation poprzez parametr annotation (tj. Widok mapy daje Ci odniesienie do dokładnej obiektu adnotacji to chce tego widoku).

Przykład:

MapViewAnnotation *newAnnotation = [[MapViewAnnotation alloc] init... 
newAnnotation.yesno = tempObj.yesno; // <-- set property in annotation 
[self.mapView addAnnotation:newAnnotation]; 

Następnie w viewForAnnotation:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation 
{ 
    if (![annotation isKindOfClass:[MapViewAnnotation class]]) 
    { 
     // Return nil (default view) if annotation is 
     // anything but your custom class. 
     return nil; 
    } 

    static NSString *reuseId = @"currentloc"; 

    MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; 
    if (annView == nil) 
    { 
     annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId];   
     annView.animatesDrop = NO; 
     annView.canShowCallout = YES; 
     annView.calloutOffset = CGPointMake(-5, 5); 
    } 
    else 
    { 
     annView.annotation = annotation; 
    } 

    MapViewAnnotation *mvAnn = (MapViewAnnotation *)annotation; 
    if (mvAnn.yesno) 
    { 
     annView.pinColor = MKPinAnnotationColorGreen; 
    } 
    else 
    { 
     annView.pinColor = MKPinAnnotationColorRed; 
    } 

    return annView; 
} 
+0

Dzięki za odpowiedź. Jak dodać właściwość yesno doMapViewAnnotation? – user1096447

+1

W MapViewAnnotation.h, umieść '@property (nonatomic, assign) BOOL yesno;' aw MapViewAnnotation.m wstaw '@synthesize yesno;' – Anna

+0

Dzięki Anna, stil a releynna odpowiedź. –

0
MKPinAnnotationView *pin = (MKPinAnnotationView *) [self.mapView dequeueReusableAnnotationViewWithIdentifier: @"id"]; 
if (pin == nil) 
{ 
    pin = [[MKPinAnnotationView alloc] initWithAnnotation: annotation reuseIdentifier: @"id"] ; 
} 
else 
{ 
    pin.annotation = annotation; 
} 

pin.pinTintColor=[UIColor blueColor]; 
pin.canShowCallout = true; 
Powiązane problemy