Метод и реализация аксессуара Right Callout - PullRequest
12 голосов
/ 28 октября 2011

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

РЕДАКТИРОВАТЬ

Я пробовал эту строку кода, но с аннотацией ничего не происходит.

- (MKAnnotationView *)mapview:(MKMapView *)sender viewForAnnotation:(id <MKAnnotation>)annotation 
{
MKAnnotationView *aView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@""];
aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
aView.canShowCallout = YES;
aView.annotation = annotation;
return aView;
}

1 Ответ

34 голосов
/ 28 октября 2011

Имя метода неверно.Это должно быть mapView с большой буквы V:

- (MKAnnotationView *)mapView:(MKMapView *)sender 
            viewForAnnotation:(id <MKAnnotation>)annotation 

Objective-C чувствителен к регистру.

Если метод все еще не вызывается, то другая проблемаявляется то, что вид карты delegate не установлен.В коде установите его на self или в Интерфейсном Разработчике присоедините делегата к Владельцу файла.

Также убедитесь, что вы установили title аннотации, прежде чем добавить ее, в противном случае выноска все равно не будет отображаться.

Приведенные выше изменения должны исправить появление дополнительной кнопки.


Некоторые другие несвязанные предложения ...

В viewForAnnotation следует поддерживать просмотр аннотаций повторно.-использование по телефону dequeueReusableAnnotationViewWithIdentifier:

- (MKAnnotationView *)mapView:(MKMapView *)sender viewForAnnotation:(id < MKAnnotation >)annotation
{
    static NSString *reuseId = @"StandardPin";

    MKPinAnnotationView *aView = (MKPinAnnotationView *)[sender 
                dequeueReusableAnnotationViewWithIdentifier:reuseId];
    if (aView == nil)
    {
        aView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation 
                    reuseIdentifier:reuseId] autorelease];
        aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        aView.canShowCallout = YES;
    }

    aView.annotation = annotation;

    return aView;   
}

Если ваш проект использует ARC, удалите autorelease.


Кстати, чтобы ответить на нажатие вспомогательной кнопки, нажмите,реализовать метод делегата calloutAccessoryControlTapped:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view 
        calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"accessory button tapped for annotation %@", view.annotation);
}
...