Anotaciones de vista de mapa con diferentes colores de pin

Tengo una matriz con más de 200 objetos y estoy tratando de realizar un ciclo a través de cada uno de ellos.

Cada objeto tendrá un campo de sí / no y quiero mostrar un marcador de color diferente dependiendo de ese valor de sí / no.

De lo que puedo ver es que mi loop va pasando por cada objeto primero y luego toda la anotación se agrega al final para cada objeto.

Como realizo una comprobación dentro de mi ciclo a través de la matriz en el valor sí no cuando toda la anotación se agrega a mi mapa, usará el valor sí / no del último objeto en la matriz cuando vaya a trazar para todos.

¿Cómo puedo tenerlo para que el marcador sea diferente dependiendo del valor de sí / no para cada elemento individual?

Mi código es

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 mi código de anotación de la siguiente manera

 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) 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; } 

y current_yesno está declarado en mi archivo .h

El método de delegado viewForAnnotation no se llama necesariamente inmediatamente después de addAnnotation y también puede addAnnotation en otro momento la vista de mapa cuando necesita obtener la vista para una anotación (mientras que su código está haciendo algo completamente diferente).

Por lo tanto, no puede depender del valor de un ivar que esté sincronizado con algún código fuera de ese método delegado.

En su lugar, agregue la propiedad yesno a su clase personalizada MapViewAnnotation , MapViewAnnotation al crear la anotación y luego acceda a su valor en viewForAnnotation mediante el parámetro de annotation (es decir, la vista del mapa le proporciona una referencia al objeto de anotación exacto para el que desea la vista )

Ejemplo:

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

Luego, en viewForAnnotation :

 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) 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; } 
 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;