在MapView.annotations数组中获取MKAnnotation的索引

时间:2014-01-13 18:47:40

标签: ios xcode indexing mkmapview mkannotation

我正在使用MKMapView和MKAnnotations在xCode中创建一个应用程序。如果您制作两个以上的注释,则应将额外的航点颜色(PinAnnotations)更改为紫色。

因此我需要注释中的标签,IndexPath或ID ,以识别MKAnnotation函数中的MKAnnotation。我使用了这行代码:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    MKPinAnnotationView *pinView = nil;

    if (annotation != mkMap.userLocation)
    {
        static NSString *defaultPinID = @"aPin";
        pinView = (MKPinAnnotationView *)[mkMap dequeueReusableAnnotationViewWithIdentifier:defaultPinID];

        if (pinView == nil)
        {
            pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:defaultPinID];

            pinView.canShowCallout = YES;

            pinView.tag = mapView.annotations.count;    // tag is not available for annotation in this function
        }
    }

    pinView.canShowCallout = YES;
    pinView.animatesDrop = YES;
    pinView.draggable = YES;


    if ([annotation isKindOfClass:[MKUserLocation class]])
        return pinView;

    NSLog(@"Annotation-Index: %d", [mapView.annotations indexOfObject:annotation]);
    NSLog(@"MapView.annotations.count = %d", mapView.annotations.count);

    if (1 == [mapView.annotations indexOfObject:annotation])
        pinView.pinColor = MKPinAnnotationColorGreen;
    else if (1 < [mapView.annotations indexOfObject:annotation])
    {

        pinView.pinColor = MKPinAnnotationColorRed;

        // checkes for extra waypoints
        if (2 < mapView.annotations.count)
        {
            for (int i = 2; i > mapView.annotations.count; i++)
            {
                MKPinAnnotationView *aView = [mapView.annotations objectAtIndex:i];
                aView.pinColor = MKPinAnnotationColorPurple;

                [mapView removeAnnotation:mapView.annotations[i]];
                NSMutableArray *a = [[NSMutableArray alloc] init];
                [a replaceObjectAtIndex:i withObject:aView];

                [mapView addAnnotations:a];
            }
        }
    }

    return pinView;
}

我已经谷歌这个问题并找到了许多像我一样的解决方案

int AnnotationIndex = [mapView.annotations indexOfObject:annotation];

但是这个功能的输出(Annotation-Index)让我印象深刻。有时一切都很好但是Annotation-Index具有正确的值,但是大多数时候值似乎是随机生成的,如果MapView.annotations.count只有3,那么刻度也会从0增加到10!

致以最诚挚的问候和感谢!

1 个答案:

答案 0 :(得分:1)

建议的处理方法是创建自己的实现MKAnnotation协议的类,并且具有可以在viewForAnnotations期间检查以查看要使用的颜色的属性。 MKMapView中的annotations数组不保证按照向地图添加注释的顺序排列。你可能会烦恼,烦恼然后惹恼但你可能会回来[anno2,anno3,anno1]。这就是它的方式,你无法改变它。因此,您可以保留自己的注释数组,这些注释不会重新排列。如果适合,可以使用额外的财产理念。

你不应该做的一件事是在viewForAnnotation函数中添加更多注释,这真的搞砸了。