使用plist文件无法获得不同的图像

时间:2012-05-28 18:56:35

标签: ios xcode image annotations

我使用plist文件存储字典中包含Name,Address,Coordinates和Icon(pin图像名称)字符串的注释数据。我需要在地图上用pin图像显示我的注释,具体取决于plist中的Icon字符串。我循环我的注释字典,但它显示在我所有引脚上的第一个字典的地图引脚图像上。

我的代码:

- (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文件构造:

enter image description here

它向我展示的内容:

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

您需要将pinView.image设置为<{>> 当前 注释Icon的项目的viewForAnnotation被调用(即传递的annotation参数)。所以你可以保持for循环并检查项是否与annotation匹配,然后再设置pinView.image(然后从for循环中设置break

但是,在该委托方法中不断重新阅读并循环使用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中,您可以直接从icon阅读annotation属性。但首先,您应该检查annotation是否属于您的自定义类类型(因此用户位置蓝点不会受到影响,并且相当确定annotation将拥有您要访问的属性):

- (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设置。