2012-06-05 14 views
5

Ho una matrice con oltre 200 oggetti e sto provando a eseguire un ciclo attraverso ciascuno di essi.Annotazioni della vista mappa con colori pin diversi

Ogni oggetto avrà un campo sì/no e voglio visualizzare un indicatore di colore diverso a seconda del valore sì/no.

Da quello che riesco a vedere sta succedendo che il mio ciclo attraversa prima ciascun oggetto e poi tutte le annotazioni sono aggiunte alla fine per ogni oggetto.

Poiché eseguo un controllo all'interno del mio ciclo attraverso l'array sul valore yes no quando tutte le annotazioni vengono aggiunte alla mia mappa, utilizzeranno il valore sì/no dall'ultimo oggetto nell'array quando si passa alla trama per tutti.

Come posso fare in modo che il marcatore dipenda dal valore sì/no per ogni singolo elemento?

mio codice è

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];    
      } 

con il mio codice di annotazione come segue

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

} 

e current_yesno è dichiarato nel mio file .h.

risposta

8

Il metodo viewForAnnotation delegato non è necessariamente chiamato immediatamente dopo che fai addAnnotation e può anche essere chiamato in altri orari la visualizzazione della mappa quando è necessario ottenere la vista per un'annotazione (mentre il codice sta facendo qualcosa di completamente diverso).

Quindi non è possibile dipendere dal valore di un ivar sincronizzato con un codice esterno al metodo delegato.

Invece, aggiungere la proprietà yesno per la classe personalizzata MapViewAnnotation, impostare quando si crea l'annotazione e quindi accedere il suo valore nel viewForAnnotation tramite il parametro annotation (es. La vista mappa è che si dà un riferimento all'oggetto esatto di annotazione è vuole la vista per).

Esempio:

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

Poi nel 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

Grazie per la risposta. Come aggiungo la proprietà yesno aMapViewAnnotation? – user1096447

+1

In MapViewAnnotation.h, metti '@property (nonatomic, assegna) BOOL yesno;' e in MapViewAnnotation.m metti '@synthesize yesno;' – Anna

+0

Grazie Anna, stil una risposta pertinente. –

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; 
Problemi correlati