1

我使用 plist 文件在字典中存储具有名称、地址、坐标和图标(图钉图像名称)字符串的注释数据。我需要根据 plist 中的图标字符串在地图上使用 pin 图像显示我的注释。我循环我的注释字典,但它显示在我所有引脚上的第一个字典的地图引脚图像上。

我的代码:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{


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

    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView* pinView = [[MKPinAnnotationView alloc]
                                    initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];


    NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"plist"];
    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

    for(path in dict){

        NSString *theCategory;

        theCategory = [NSString stringWithFormat:@"%@", path];
        NSLog(@"%@", path);

        NSArray *anns = [dict objectForKey:theCategory];

        pinView.image = [UIImage imageNamed:[[anns objectAtIndex:0] objectForKey:@"Icon"]];

    }

    pinView.canShowCallout=YES;


    return pinView;
}

我的 plist 文件构造:

在此处输入图像描述

它向我展示了什么:

在此处输入图像描述

4

1 回答 1

0

将为添加的viewForAnnotation每个注释调用委托方法。

您在该方法中的 for 循环将对每个注释以相同的方式运行。所有 for 循环最终所做的(每个注释的每次)都设置pinView.image为 for 循环读取的最后一项。这恰好是 plist 中第一个字典中的第一项。

您需要设置pinView.image当前正在调用的注释Icon的项目(即传递的参数)。因此,您可以保留 for 循环并检查项目是否匹配,然后才设置(然后退出 for 循环)。viewForAnnotationannotationannotationpinView.imagebreak

但是,在该委托方法中不断地重新阅读和循环一个 plist 并不是一个好主意。最好为Icon注释类创建一个属性,在创建注释时设置属性(您可能首先循环通过 plist 来创建注释),然后直接从注释对象本身中使用该属性viewForAnnotation委托方法。

假设您有一些自定义注释类,请将 Icon 添加为属性:

@interface MyAnnotationClass : NSObject<MKAnnotation>

@property (nonatomic, assign) CLLocationCoordinate2D coordinate;
@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *subtitle;
@property (nonatomic, copy) NSString *icon;  //<---and @synthesize it in .m

然后在循环 plist 以创建注释的地方,像设置icon属性一样设置title属性:

ann.title = [item objectForKey:@"Name"];
ann.icon = [item objectForKey:@"Icon"];

最后,在 中,您可以直接从viewForAnnotation中读取属性。但首先,您应该检查它是否属于您的自定义类类型(因此用户位置蓝点不会受到影响,并且可以合理地确定将拥有您将要访问的属性):iconannotationannotationannotation

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if (![annotation isKindOfClass:[MyAnnotationClass class]])
    {
        // Note "!" sign in front of above condition.
        // Return nil (default view) if annotation is 
        // anything but your custom class.
        return nil;
    }

    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

    MKAnnotationView *pinView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
    // Create an MKAnnotationView instead of MKPinAnnotationView
    // because we are setting a custom image.
    // Using MKPinAnnotationView sometimes overrides custom image
    // with the built-in pin view.
    if (pinView == nil)
    {
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
        pinView.canShowCallout = YES;
    }
    else
        pinView.annotation = annotation;

    MyAnnotationClass *myAnn = (MyAnnotationClass *)annotation;
    pinView.image = [UIImage imageNamed:myAnn.icon];
    // May want to check if myAnn.icon is blank (length == 0)
    // (OR if pinView.image is still nil after setting)
    // and show some default image in that case otherwise
    // annotation will be invisible.

    return pinView;
}

顺便说一句,在您的 plist 文件中,Test3没有Icon设置。

于 2012-05-29T02:48:55.117 回答