MKAnnotation не показывает выноску на MKMapView - PullRequest
14 голосов
/ 20 ноября 2011

У меня есть MKMapView, и я добавляю аннотации вроде этого:

for (NSDictionary *tmp in response)
{
    NSDictionary *places = [tmp objectForKey:@"place"];
    NSDictionary *location = [places objectForKey:@"location"];
    NSLog(@"long: %@ Lat:%@",[location objectForKey:@"longitude"], [location objectForKey:@"latitude"]);

    float longitude = [[location objectForKey:@"longitude"] floatValue];
    float latitude = [[location objectForKey:@"latitude"] floatValue];


    CLLocationCoordinate2D locationco = {latitude,longitude};
    NSString *titleString = [tmp objectForKey:@"name"];

    Place *pin = [[Place alloc] init];
    pin.coordinate = locationco;
    pin.title = titleString;
    pin.subtitle = @"A Location";

    //NSArray *annots = [[NSArray alloc] initWithObjects:pin, nil];
    //[map addAnnotations:annots];
    [map addAnnotation:pin];
    [[map viewForAnnotation:pin] setCanShowCallout:YES];
}

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

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
    [view setCanShowCallout:YES];
    NSLog(@"Title:%@",[view.annotation description]);
}

Но это просто распечатывает

Title:(null)

Я использую ARC, и у меня есть свойства, установленные в моем объекте Place следующим образом:

@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic,readwrite, copy) NSString *title;
@property (nonatomic,readwrite, copy) NSString *subtitle;

Что я делаю неправильно / отсутствует? Спасибо.

Ответы [ 2 ]

41 голосов
/ 21 ноября 2011

Выноска не отображается, потому что title равен nil.

Нет необходимости реализовывать viewForAnnotation для отображения выносок, поскольку реализация представления карты по умолчанию отображает выноски.(Однако, если вы делаете реализуете его, вы должны установить canShowCallout в этом методе делегата, а не в том месте, где вы это делаете прямо сейчас.)

Даже если вы установите canShowCallout вYES, выноска по-прежнему не будет отображаться, если title nil или пусто.

Записать словарь tmp.Либо клавиша name пуста, либо ее не существует.

9 голосов
/ 21 ноября 2011

Вам необходимо реализовать метод MKMapViewDelegate mapView:viewForAnnotation:, который создает представление и возвращает его.В этом методе вызовите [view setCanShowCallout:YES]; для представления, которое вы планируете вернуть для аннотации.

Поскольку mapView:didSelectAnnotationView: называется ПОСЛЕ того, как выбран пин-код, это не повлияет на включение / отключение выноски.

...