Добавление разных изображений в разные виды аннотаций в xcode

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

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    NSLog(@"welcome into the map view annotation");

    // if it's the user location, just return nil.
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    // try to dequeue an existing pin view first
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc]
                                     initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier] autorelease];
    pinView.animatesDrop=YES;
    pinView.canShowCallout=YES;
    pinView.pinColor=MKPinAnnotationColorPurple;


    UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    [rightButton addTarget:self
                    action:@selector(showDetails:)
          forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    if (CLLocationCoordinate2D == theCoordinate1) {

    UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Jeff.png"]];
    pinView.leftCalloutAccessoryView = profileIconView;
    [profileIconView release];

    }else if(CLLocationCoordinate2D = theCoordinate2) {
        UIImageView *profileIconView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Pierce.png"]];
        pinView.leftCalloutAccessoryView = profileIconView;
        [profileIconView release];
    }

Я получаю сообщение об ошибке для строки, где я пишу

if (CLLocationCoordinate2D == theCoordinate1) {

Я не совсем уверен, что не так, и я не могу найти другой способ идентифицировать отдельную аннотацию. Любая помощь с благодарностью!

1 ответ

Решение

Эта строка дает ошибку, потому что CLLocationCoordinate2D это тип структуры и theCoordinate1 Я полагаю, переменная типа CLLocationCoordinate2D, Вы не можете сравнить два.

То, что вы пытаетесь сделать, это сравнить координаты текущей аннотации, для которой запрашивается представление, с координатами в theCoordinate1, Для этого вам нужно что-то вроде этого:

if ((annotation.coordinate.latitude == theCoordinate1.latitude) 
        && (annotation.coordinate.longitude == theCoordinate1.longitude)) {

Однако я не рекомендую сравнивать числа с плавающей запятой таким образом, даже если это иногда "работает". Если вы должны сравнить координаты, используйте CLLocation's distanceFromLocation: метод и посмотреть, если расстояние между ними ниже некоторого порога, как 10,0 метров.

Другой способ проверить, нужна ли аннотация, - это сохранить ссылку на саму аннотацию (ту, которую вы передали addAnnotation: метод), а затем вы можете сделать if (annotation == theAnnotation1),

Если вы не хотите сохранять ссылку на аннотации, вы также можете проверить, является ли заголовок аннотации тем, который вы ищете (if ([annotation.title isEqualToString:@"Jeff"])).

Лучший способ - добавить пользовательское свойство (в идеале int) в пользовательский класс аннотаций и проверить это в viewForAnnotation.


Несколько других не связанных вещей:

  • Вместо того, чтобы делать addTarget, обработайте нажатие кнопки в собственном представлении карты calloutAccessoryControlTapped метод делегата, который даст ссылку на аннотацию (например, см. Как найти аннотацию, отправляющую showDetails?).
  • У вас есть комментарий к "dequeue", но вы этого не делаете. Рекомендуется использовать dequeueReusableAnnotationViewWithIdentifier в viewForAnnotation для повторного использования представлений (см., например, EXC_BAD_ACCESS с MKPinAnnotationView).
Другие вопросы по тегам