Во-первых, убедитесь, что delegate
вида карты установлен, иначе ваш viewForAnnotation
метод не будет вызван.
Далее, дополнительная кнопка появляется на аннотации callout , которая появится только если вы установите canShowCallout
:
annView.canShowCallout = YES;
Далее, вместо использования собственного метода для обработки действия кнопки, гораздо лучше использовать собственный метод делегата вида карты calloutAccessoryControlTapped
, который вызывается при нажатии на аксессуар:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
NSLog(@"inside the stupid method");
//Here, the annotation tapped can be accessed using view.annotation
}
Удалить строку [detailButton addTarget...
из viewForAnnotation
.
Также обратите внимание, что в вашем NSLog
в методе showDetailView отсутствует ведущий @
, что приведет к сбою при вызове метода.
Другое дело, что вы должны использовать dequeueReusableAnnotationViewWithIdentifier
в viewForAnnotation
для повторного использования представления аннотаций.
Пример по запросу :
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
static NSString *annReuseId = @"currentloc";
MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annReuseId];
if (annView == nil)
{
annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annReuseId];
annView.animatesDrop = YES;
annView.canShowCallout = YES;
UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
annView.rightCalloutAccessoryView=detailButton;
}
else {
annView.annotation = annotation;
}
return annView;
}
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation);
MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
//here, can set annotation info in some property of detailView
[[self navigationController] pushViewController:detailView animated:YES];
[detailView release];
}