Добавление разных изображений в разные виды аннотаций в xcode - PullRequest
1 голос
/ 27 мая 2011

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

- (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 Ответ

2 голосов
/ 27 мая 2011

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

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

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

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

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

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

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


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

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