2012-06-05 17 views
5

Tengo una matriz con más de 200 objetos y estoy tratando de realizar un bucle a través de cada uno de ellos.Anotaciones de vista de mapa con diferentes colores de pin

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

Por lo que puedo ver es que mi loop va pasando por cada objeto primero y luego se agrega toda la anotación al final de 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 se 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 <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; 

} 

y current_yesno se declara en mi archivo .h.

Respuesta

8

El método viewForAnnotation delegado no está necesariamente llamado inmediatamente después de hacer addAnnotation y también puede ser llamado en otras ocasiones por la vista del mapa cuando se necesita para obtener la vista para una anotación (mientras que su código está haciendo algo completamente diferente)

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

lugar, agregue la propiedad yesno a la clase personalizada MapViewAnnotation, ponerlo al crear la anotación y luego acceder a su valor en viewForAnnotation a través del parámetro annotation (es decir. La vista del mapa se le da una referencia al objeto de anotación exacta se quiere la vista para).

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

Gracias por la respuesta. ¿Cómo agrego la propiedad yesno aMapViewAnnotation? – user1096447

+1

En MapViewAnnotation.h, ponga '@property (no atómico, asigne) BOOL yesno;' y en MapViewAnnotation.m ponga '@synthesize yesno;' – Anna

+0

Gracias Anna, todavía tiene una respuesta relevante. –

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; 
Cuestiones relacionadas