Добавление нескольких аннотаций с несколькими изображениями на карте в ios Objective- c? - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над старым приложением, и мне нужно внести изменения в Mapview. Ранее нам нужно было отображать несколько аннотаций в виде карты с одинаковыми изображениями на каждом выводе, но теперь мы должны показывать разные изображения на выводах аннотаций для отображения адреса. Я использую следующий код для отображения выводов аннотации, но он всегда показывает одно и то же изображение на выводах аннотаций.

Вот мой код:

- (MKAnnotationView *) mapView:(MKMapView *)mapView1 viewForAnnotation:(id <MKAnnotation>) annotation
{
    NSLog(@"Eventtype Array is %@",eventTypeArray);
    MKAnnotationView * pinView = nil;
    if(annotation != _mapvw.userLocation)
    {
        static NSString * defaultPinID = @"pinId";
        pinView = (MKAnnotationView *)[_mapvw dequeueReusableAnnotationViewWithIdentifier:defaultPinID];

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

    for ( int i=0; i<[eventTypeArray count]; i++)
        {
            eventTypeStr = [NSString stringWithFormat:@"%@",
                             [eventTypeArray objectAtIndex:i]];
            NSLog(@"Event Type is %@",eventTypeStr);

        if ([eventTypeStr isEqualToString:@"0"])
        {
            NSLog(@"Eventtype Array is %@",eventTypeStr);
            NSLog(@"Event Type is %@",eventTypeStr);
            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:@"smiley.png"];
        }
        else if ([eventTypeStr isEqualToString:@"1"])
        {
            NSLog(@"Event Type is %@",eventTypeStr);
            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:@"dollar1.png"];
        }
        else if ([eventTypeStr isEqualToString:@"2"])
        {
            NSLog(@"Event Type is %@",eventTypeStr);
            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:@"donation.png"];
        }
        }
    }
    return pinView;
}

1 Ответ

0 голосов
/ 01 мая 2020

Вы перебираете свой массив типов событий для каждой аннотации, предположительно всегда заканчивая изображением, связанным с последним в eventTypeArray.

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

Итак, во-первых, вы еще этого не сделали, у вас будет аннотация с eventType свойство:

typedef NS_ENUM(NSUInteger, EventType) {
    EventTypeSmiley,
    EventTypeDollar,
    EventTypeDonation,
};

@interface EventAnnotation: MKPointAnnotation
@property (nonatomic) EventType eventType;
@end

@implementation EventAnnotation
@end

Теперь, в этом случае, я использую перечисление для моих типов событий, но вы можете использовать любой тип, который хотите. (Даже если вы придерживаетесь массива типов событий, я все равно использовал бы перечисление для удаления значений crypti c 0/1/2, разбросанных по всему коду.)

Затем, когда вы добавляете аннотации к вашему карта, используйте этот новый тип аннотации, а не MKPointAnnotation:

EventAnnotation *eventAnnotation = [[EventAnnotation alloc] init];
eventAnnotation.coordinate = coordinate;
eventAnnotation.title = @"Fund raiser";
eventAnnotation.eventType = EventTypeDollar;

Теперь, когда все ваши аннотации EventAnnotation, вы можете сделать так, чтобы ваш viewForAnnotation действовал соответственно:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }

    NSAssert([annotation isKindOfClass:[EventAnnotation class]], @"Was expecting event annotation”);  // obviously, handle non-EventAnnotation annotations however you want, but I’m going to catch failures for now

    static NSString *identifier = @"EventAnnotation";
    MKAnnotationView *annotationView = [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (!annotationView) {
        annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        annotationView.canShowCallout = YES;
    } else {
        annotationView.annotation = annotation;     // don't forget this line!
    }

    EventAnnotation *eventAnnotation = (EventAnnotation *)annotation;
    switch (eventAnnotation.eventType) {
        case EventTypeSmiley:
            annotationView.image = [UIImage imageNamed:@"smiley.png"];
            break;

        case EventTypeDollar:
            annotationView.image = [UIImage imageNamed:@"dollar1.png"];
            break;

        case EventTypeDonation:
            annotationView.image = [UIImage imageNamed:@"donation.png"];
            break;
    }

    return annotationView;
}
...