2012-06-05 5 views
5

У меня есть массив с более чем 200 объектами, и я пытаюсь выполнить цикл через каждый из них.Отображение аннотаций карт с разными цветами контактов

У каждого объекта будет поле yes/no, и я хочу отобразить другой цветной маркер, зависящий от этого значения yes/no.

Из того, что я вижу, происходит, когда моя петля проходит через каждый объект сначала, а затем вся аннотация добавляется в конце для каждого объекта.

Поскольку я выполняю проверку внутри своего цикла через массив по значению yes no, когда вся аннотация добавляется в мою карту, она будет использовать значение yes/no из последнего объекта в массиве, когда оно переходит в график для всех.

Как это сделать, чтобы маркер был различным в зависимости от значения да/нет для каждого отдельного элемента?

Мой код

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

с моим кодом аннотаций следующим

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

} 

и current_yesno объявлена ​​в моем файле .h.

ответ

8

Метод viewForAnnotation делегата не обязательно вызывается сразу после того, как вы addAnnotation и он также может быть вызван в другое время по мнению карты, когда ему необходимо получить вид на аннотацию (в то время как ваш код делает что-то совсем другое).

Таким образом, вы не можете зависеть от того, какое значение имеет значение ivar, связанное с некоторым кодом вне этого метода делегата.

Вместо этого добавьте yesno свойства пользовательского класса MapViewAnnotation, установите его при создании аннотаций, а затем получить доступ к его значению в viewForAnnotation через параметр annotation (то есть. Вид карты дает вам ссылку на точный объект аннотаций его хочет видеть).

Пример:

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

Тогда в 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

Спасибо за ответ. Как добавить свойство yesno toMapViewAnnotation? – user1096447

+1

В MapViewAnnotation.h поместите '@property (неатомный, назначьте) BOOL yesno;' и в MapViewAnnotation.m поместите '@synthesize yesno;' – Anna

+0

Спасибо Анне, ответьте соответствующим ответом. –

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; 
Смежные вопросы