Ответ 1
Имя метода неверно. Он должен быть mapView
с капиталом V
:
- (MKAnnotationView *)mapView:(MKMapView *)sender
viewForAnnotation:(id <MKAnnotation>)annotation
Objective-C чувствителен к регистру.
Если метод все еще не вызван, тогда другая проблема заключается в том, что отображение вида delegate
не задано. В коде установите его в self
или в Interface Builder присоедините делегата к файловому владельцу.
Также убедитесь, что вы установите 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);
}