2012-06-05 66 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類,創建註釋時,設置它,然後通過annotation參數訪問viewForAnnotation它的值(即地圖視圖是給你確切的註釋對象的引用它希望看到)。

實施例:

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添加到MapViewAnnotation? – user1096447

+1

在MapViewAnnotation.h中,把'@property(nonatomic,assign)BOOL yesno;'和MapViewAnnotation.m放在'@synthesize yesno;' – Anna

+0

謝謝Anna,stil一個相關的答案。 –

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;