MKAnnotationView viewForAnnotation никогда не вызывается - PullRequest
7 голосов
/ 20 июня 2011

после того, как я потратил 2 дня на поиск ошибки, я должен попросить о помощи здесь. у меня есть MapViewController и разместить некоторые булавки на карте. Я скопировал большую часть кода из MapCallouts и WeatherMap из примеров яблочного кода.

во всяком случае кажется, что я удалил или пропустил важные части. кажется, что нет никакой связи между MapViewController и следующим кодом

- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    NSLog(@"MKAnnotationView");
    return nil;
}

установка аннотации выглядит следующим образом и работает хорошо:

- (void)createPoi:(CLLocationCoordinate2D)theCoordinate
{
    NSLog(@"createPoi");

    RandomAnnotation *randomAnnotation = [[RandomAnnotation alloc] init];
    [randomAnnotation setTheCoordinate:theCoordinate];
    [randomAnnotation setTheTitle:@"bla"];
    [randomAnnotation setTheSubTitle:@"bla"];
    [self.mapAnnotations insertObject:randomAnnotation atIndex:kRandomAnnotationIndex];
    [randomAnnotation release];
    [self.mapView addAnnotation:[self.mapAnnotations objectAtIndex:kRandomAnnotationIndex]];
}

Я не могу понять, что случилось. Кто-нибудь может дать мне подсказку, чего не хватает? Я должен признать, что у меня нет никакого опыта с моделью делегата.

Ответы [ 2 ]

16 голосов
/ 20 июня 2011

Убедитесь, что свойство delegate представления карты установлено.

Если карта создана в IB, щелкните ее правой кнопкой мыши и подключите выход делегата к владельцу файла.Если карта создается в коде, установите делегат после создания представления карты:

mapView.delegate = self;
2 голосов
/ 20 июня 2011

В .h, где объявлен ваш MKMapView и где объявлен метод viewForAnnotation, обязательно добавьте MKMapViewDelegate в список протоколов, которые ваш класс должен включать:

@interface myViewController : UIViewController <MKMapViewDelegate> {
    MKMapView *_mapView;
}

Затем в методе viewDidLoad обязательно добавьте

_mapView.delegate = self;

Вы также можете назначить делегата mapView в конструкторе интерфейса, если вы сделали что-то с его помощью!

...