отображение нескольких точек mapkit с разными изображениями - PullRequest
0 голосов
/ 13 декабря 2010

Это должно быть довольно легко выяснить, я думаю ... У меня есть работающий вид карты, который сбрасывает ряд пронумерованных маркеров на карту.Я называю изображение для булавки из plist, однако, когда булавки падают, у них все есть тот же номер, что и у последнего булавки.(вместо 1,2,3 ..)

Ниже приведен код ошибки, я просто не уверен, как это исправить ... спасибо.

 NSString *path = [[NSBundle mainBundle] pathForResource:[route objectForKey:NAME_KEY] ofType:@"plist"];
 NSMutableArray* array = [[NSMutableArray alloc] initWithContentsOfFile:path];
 points = array;

 for (NSDictionary *routeDict in points){
 AllAnnotations *Annotation = [[AllAnnotations alloc] initWithDictionary:routeDict];
 [mapView addAnnotation:Annotation];
 [Annotation release];
 }



  for (NSDictionary *routeDict in points){ 
  NSString *first = [routeDict objectForKey: POINT_KEY];
  NSString *getNum = [routeDict objectForKey: COLOR_KEY];
  NSString *again = [getNum stringByAppendingString:first];
  NSString *imgValue = [again stringByAppendingString:@".png"];
  annotationView.image = [UIImage imageNamed:imgValue];
  }

  annotationView.canShowCallout = YES;

AllAnnotations.m
------------------------------------------------------------------------------------------
- (id) initWithDictionary:(NSDictionary *) dict
{
    self = [super init];
    if (self != nil) {
        coordinate.latitude = [[dict objectForKey:@"latitude"] doubleValue];
        coordinate.longitude = [[dict objectForKey:@"longitude"] doubleValue];
        self.title = [dict objectForKey:@"name"];
        self.subtitle = [dict objectForKey:@"subname"];

    }
    return self;
}

1 Ответ

0 голосов
/ 13 декабря 2010

Второй цикл проходит через все точки (аннотации), и текущий вид аннотации заканчивается изображением для последней точки.Объект annotationView не изменяется внутри этого цикла.

Я предполагаю, что второй цикл и последняя строка находятся в методе viewForAnnotation.

Вместо того, чтобы проходить по всем точкам, вы должны получить routeDict изтолько текущий объект аннотации и установите изображение annotationView один раз.

Предполагая, что вы добавили routeDict как свойство в классе AllAnnotations, вы должны сделать что-то вроде этого:

NSDictionary *routeDict = ((AllAnnotations *)annotation).routeDict;
NSString *first = [routeDict objectForKey: POINT_KEY];
NSString *getNum = [routeDict objectForKey: COLOR_KEY];
NSString *again = [getNum stringByAppendingString:first];
NSString *imgValue = [again stringByAppendingString:@".png"];
annotationView.image = [UIImage imageNamed:imgValue];

Редактировать:
Исходя из обновленного кода в вашем вопросе и комментариях, вот изменения, которые вам нужно внести.

В AllAnnotations.h добавьте ivar для хранения файла изображенияимя для аннотации:

@interface AllAnnotations : NSObject <MKAnnotation> {
    //existing ivars here
    NSString *imageFileName;
}
//existing properties here
@property (copy) NSString *imageFileName;
//existing method headers here
@end

В AllAnnotations.m добавьте синтез для нового ivar и обновите методы initWithDictionary и dealloc:

@synthesize imageFileName;

- (id) initWithDictionary:(NSDictionary *) dict
{
    self = [super init];
    if (self != nil) {
        coordinate.latitude = [[dict objectForKey:@"latitude"] doubleValue];
        coordinate.longitude = [[dict objectForKey:@"longitude"] doubleValue];
        self.title = [dict objectForKey:@"name"];
        self.subtitle = [dict objectForKey:@"subname"];

        //set this annotation's image file name...
        NSString *first = [dict objectForKey: POINT_KEY];
        NSString *getNum = [dict objectForKey: COLOR_KEY];
        NSString *again = [getNum stringByAppendingString:first];
        self.imageFileName = [again stringByAppendingString:@".png"];
    }
    return self;
}

- (void) dealloc
{
    [title release];
    [subtitle release];
    [imageFileName release];
    [super dealloc];
}

В качестве альтернативы, вы можете сохранить значенияобъектов POINT_KEY и COLOR_KEY в аннотации и генерируют имя файла в методе viewForAnnotation.

Кстати, «AllAnnotations» не является хорошим именем для этого класса, который представляет одну аннотацию.Возможно, «RouteAnnotation» будет лучше.

Наконец, метод viewForAnnotation должен выглядеть следующим образом:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKAnnotationView * annotationView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"annot"];
    if (!annotationView) {
        annotationView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"annot"] autorelease];
        annotationView.canShowCallout = YES;
    }
    else {
        annotationView.annotation = annotation;
    }

    AllAnnotations *routeAnnotation = (AllAnnotations *)annotation;
    annotationView.image = [UIImage imageNamed:routeAnnotation.imageFileName];

    return annotationView;
}   
...