2

我有一个NSArray自定义MKAnnotation,我需要为第一个/最后一个注释设置一个红色引脚颜色,否则设置一个绿色引脚。该程序的行为不像我想要的那样,绿色引脚每次都以随机方式与两个不同的注释相关联,不像我想要的那样与第一个和最后一个相关联。

所以,这就是我在我的控制器中所做的:

- (void)viewDidLoad
{   
    [super viewDidLoad];   
    //load set a coords from file etc...  
    //self.coordinates is the array of annotations   
    [self.myMap addAnnotations:self.coordinates];  
} 

然后在 viewForAnnotation: 回调中:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
    NSString *ident = @"MY_IDENTIFIER";
    MKPinAnnotationView *annView=(MKPinAnnotationView *)[self.myMap dequeueReusableAnnotationViewWithIdentifier:ident];
    if(self.myMap.userLocation==annotation){
        return nil;
    }
    if(annView == nil){
        annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:ident];
        annView.animatesDrop=TRUE;
        annView.canShowCallout = YES;
        annView.rightCalloutAccessoryView=[UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annView.calloutOffset = CGPointMake(-5, 5);
        int currIdxAnn=[self.myMap.annotations indexOfObject:annotation];
        int lastIdxAnn=[self.myMap.annotations indexOfObject:[self.myMap.annotations lastObject]];
        /*
        if (currIdxAnn==0 || currIdxAnn==lastIdxAnn) {
            annView.pinColor=MKPinAnnotationColorRed;
        }else {
            annView.pinColor=MKPinAnnotationColorGreen;
        }*/
         CustomAnnotation *an=(CustomAnnotation *)annotation;
         if (an.tag==98||an.tag==99) {
            annView.pinColor=MKPinAnnotationColorGreen;
         }else {
            annView.pinColor=MKPinAnnotationColorRed;
         }

    }
    return annView;
}

似乎该方法addAnnotations:不像我相信的那样工作,可能以与数组不同的顺序加载注释。可能吗?
我也尝试过类似的过程,didAddAnnotationViews:但没有好的结果。

一些提示?谢谢。

PS:当我写完这个问题时,我发现了这个回复,似乎证实了我的理论。有人已经遇到过类似的问题吗?

编辑:经过几次测试,我意识到完成我想要的最好的方法是首先为我的第一个/最后一个注释设置一个标签:

CustomAnnotation *first=[self.coordinates objectAtIndex:0];
first.tag=98;
CustomAnnotation *last=[self.coordinates objectAtIndex:[self.coordinates indexOfObject:[self.coordinates lastObject]]];
last.tag=99;

然后如您所见,我稍微修改viewForAnnotation了注释以了解注释是我要查找的注释。然后诀窍就是调用在后台线程中添加注释的函数,例如:

[self performSelectorInBackground:@selector(addAllAnnot) withObject:nil];

-(void)addAllAnnot{

    [self.myMap addAnnotations:self.coordinates];
}

经过一周的测试,这对我有用,如果有人有更好的想法,将不胜感激。

4

2 回答 2

2

查看您在答案中提到的答案,我认为您无法确定添加这些注释的顺序或它们在地图视图的内部列表中的索引。

那么你有什么选择..?与往常一样,最基本的 - 对 MKAnnotation 类进行子类化并向其添加一个属性,通过该属性您可以区分正在添加的注释。因此,只需在数组中添加这些注释时设置属性...希望这可以解决您的问题..

于 2012-04-07T17:46:54.630 回答
0

我不会指望地图返回的数组。mapkit 可能以一种对您来说并不明显的方式对其进行了优化。

我会从您计算的坐标中保留一个变量。或者,如果您不想要,只需包含第一个和最后一个注释的数组。

于 2012-04-07T17:45:22.823 回答