I have been struggling with this for weeks, it is my school project.
I have multiple pins which shows callout that shows the title and description of the pin. I had set up the pin to show callout accessory view button too but either it has no respond when tapped or the app quit itself / crash.
I had tried many methods that i get from videos, forums, google but still i cant success on this. Anyone can help me on this or provide a tutorial?
Your help is very appreciated. Thanks in advance
Here i provide my code with only 1 pin ( i cant success with even only 1 pin

)
Code:
#import "MapViewController.h"
#import "DetailViewController.h"
#import "BridgeAnnotation.h"
enum
{
kCityAnnotationIndex = 0,
kBridgeAnnotationIndex
};
@implementation MapViewController
@synthesize mapView, detailViewController, mapAnnotations;
#pragma mark -
+ (CGFloat)annotationPadding;
{
return 10.0f;
}
+ (CGFloat)calloutHeight;
{
return 40.0f;
}
- (void)gotoLocation
{
// start off by default in San Francisco
MKCoordinateRegion newRegion;
newRegion.center.latitude = 37.786996;
newRegion.center.longitude = -122.440100;
newRegion.span.latitudeDelta = 0.112872;
newRegion.span.longitudeDelta = 0.109863;
[self.mapView setRegion:newRegion animated:YES];
}
- (void)viewDidAppear:(BOOL)animated
{
// bring back the toolbar
[self.navigationController setToolbarHidden:NO animated:NO];
}
- (void)viewDidLoad
{
self.mapView.mapType = MKMapTypeStandard; // also MKMapTypeSatellite or MKMapTypeHybrid
// create a custom navigation bar button and set it to always says "Back"
UIBarButtonItem *temporaryBarButtonItem = [[UIBarButtonItem alloc] init];
temporaryBarButtonItem.title = @"Back";
self.navigationItem.backBarButtonItem = temporaryBarButtonItem;
[temporaryBarButtonItem release];
// create out annotations array (in this example only 2)
self.mapAnnotations = [[NSMutableArray alloc] initWithCapacity:2];
// annotation for Golden Gate Bridge
BridgeAnnotation *bridgeAnnotation = [[BridgeAnnotation alloc] init];
[self.mapAnnotations insertObject:bridgeAnnotation atIndex:kBridgeAnnotationIndex];
[bridgeAnnotation release];
[self gotoLocation]; // finally goto San Francisco
}
- (void)viewDidUnload
{
self.mapAnnotations = nil;
self.detailViewController = nil;
self.mapView = nil;
}
- (void)dealloc
{
[mapView release];
[detailViewController release];
[mapAnnotations release];
[super dealloc];
}
#pragma mark -
#pragma mark ButtonActions
- (IBAction)bridgeAction:(id)sender
{
[self gotoLocation];
[self.mapView removeAnnotations:self.mapView.annotations]; // remove any annotations that exist
[self.mapView addAnnotation:[self.mapAnnotations objectAtIndex:kBridgeAnnotationIndex]];
}
#pragma mark -
#pragma mark MKMapViewDelegate
- (void)showDetails:(id)sender
{
// the detail view does not want a toolbar so hide it
[self.navigationController setToolbarHidden:YES animated:NO];
[self.navigationController pushViewController:self.detailViewController animated:YES];
}
- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// handle our two custom annotations
//
else // for Golden Gate Bridge
{
// try to dequeue an existing pin view first
static NSString* BridgeAnnotationIdentifier = @"bridgeAnnotationIdentifier";
MKPinAnnotationView* pinView = (MKPinAnnotationView *)
[mapView dequeueReusableAnnotationViewWithIdentifier:BridgeAnnotationIdentifier];
if (!pinView)
{
// if an existing pin view was not available, create one
MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
initWithAnnotation:annotation reuseIdentifier:BridgeAnnotationIdentifier] autorelease];
customPinView.pinColor = MKPinAnnotationColorPurple;
customPinView.animatesDrop = YES;
customPinView.canShowCallout = YES;
// add a detail disclosure button to the callout which will open a new view controller page
//
// note: you can assign a specific call out accessory view, or as MKMapViewDelegate you can implement:
// - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
//
UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(showDetails:)
forControlEvents:UIControlEventTouchUpInside];
customPinView.rightCalloutAccessoryView = rightButton;
return customPinView;
}
else
{
pinView.annotation = annotation;
}
return pinView;
}
return nil;
}
@end