0

我有一个带有多个注释的 MapView。我需要根据 data.plist 中的字符串值将不同的图像添加到注释中

我当前的代码(仅适用于一个类别,一张图片):

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

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

    pinView.canShowCallout=YES;

我的 plist 文件构造:

列表

编辑

我的 MapViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];


    NSMutableArray *annotations = [[NSMutableArray alloc]init];


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


    NSArray *anns = [dict objectForKey:@"Category1"];

    NSLog(@" MapView is %@",mapView);
    NSLog(@"anns is: %@", anns);



    for(int i = 0; i < [anns count]; i++) {


        NSString *coordinates = [[anns objectAtIndex:i] objectForKey:@"Coordinates"];

        double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
        double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];

        MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = realLatitude;
        theCoordinate.longitude = realLongitude;


        //calculate distance
        CLLocationCoordinate2D annocoord = myAnnotation.coordinate;
        CLLocationCoordinate2D usercoord = self.mapView.userLocation.coordinate;

        NSLog(@"ANNO  = %f, %f", annocoord.latitude, annocoord.longitude);
        NSLog(@"USER = %f, %f", usercoord.latitude, usercoord.longitude);

        CLLocation *loc = [[CLLocation alloc] initWithLatitude:myAnnotation.coordinate.latitude longitude:myAnnotation.coordinate.longitude];
        CLLocation *loc2 = [[CLLocation alloc] initWithLatitude:self.mapView.userLocation.coordinate.latitude longitude:self.mapView.userLocation.coordinate.longitude];

        NSLog(@"LOC  = %f, %f", loc.coordinate.latitude,  loc.coordinate.longitude);
        NSLog(@"LOC2 = %f, %f", loc2.coordinate.latitude, loc2.coordinate.longitude);

        CLLocationDistance dist = [loc distanceFromLocation:loc2];

        NSLog(@"DIST: %f", dist); 

        myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
        myAnnotation.title = [[anns objectAtIndex:i] objectForKey:@"Name"];
        myAnnotation.subtitle = [NSString stringWithFormat:@"%.f", dist];


        [mapView addAnnotation:myAnnotation];
        [annotations addObject:myAnnotation];
    }


    NSArray *alko = [dict objectForKey:@"Category2"];

    NSLog(@" MapView is %@",mapView);
    NSLog(@"alko is: %@", alko);


    for(int i = 0; i < [alko count]; i++) {


        NSString *coordinates = [[alko objectAtIndex:i] objectForKey:@"Coordinates"];

        double realLatitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:1] doubleValue];
        double realLongitude = [[[coordinates componentsSeparatedByString:@","] objectAtIndex:0] doubleValue];

        MyAnnotation *myAnnotation = [[MyAnnotation alloc] init];
        CLLocationCoordinate2D theCoordinate;
        theCoordinate.latitude = realLatitude;
        theCoordinate.longitude = realLongitude;

        myAnnotation.coordinate=CLLocationCoordinate2DMake(realLatitude,realLongitude);        
        myAnnotation.title = [[alko objectAtIndex:i] objectForKey:@"Name"];
        myAnnotation.subtitle = [[alko objectAtIndex:i] objectForKey:@"Address"];


        [mapView addAnnotation:myAnnotation];
        [annotations addObject:myAnnotation];
    }





    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];

}

注解

- (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];

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

    pinView.canShowCallout=YES;


    return pinView;
}
4

1 回答 1

0

这是你需要的吗?

NSString *theCategory;

// set theCategory to what you need.
theCategory = @"Category1"

NSArray *anns = [dict objectForKey:theCategory];

编辑 1

首先,您最好将注释类设置如下:

MyAnnotation.h

#import <MapKit/MapKit.h>

@interface MyAnnotation : NSManagedObject <MKAnnotation>{

CLLocationCoordinate2D coordinate;
UIImage *imageForMyAnnotation;
}

@property (nonatomic,readwrite) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) UIImage *imageForMyAnnotation;

我的注释.m

#import "MyAnnotation.h"

@implementation MyAnnotation

- (CLLocationCoordinate2D)coordinate
{
//here you can set the coordinate of your annotation
return coordinate;
}

- (UIImage *)imageForMyAnnotation{
//set the image here, i think it is depend on the coordinate right? You can put some code here to chose the category that corresponding to the coordinate
return image;
}

// optional
- (NSString *)title
{
return title;
}
- (NSString *)subtitle
{
return subtitle;
}

然后在你的mapView中,你可以添加注释

地图视图.m

[self.mapView addAnnotations:myAnnotationArray];

或者

[self.mapView addAnnotation:myAnnotation];

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

UIImageView *annotationImageView = [[UIImageView alloc] initWithImage: myAnnotation.imageForMyAnnotatioin]; 

customPinView.leftCalloutAccessoryView = annotationImageView;

}
于 2012-05-27T09:29:52.973 回答