0
votes

I have a map view with several annotations. The title of the annotation is the name of the business and the subtitle is the address. There is a detailDisclosure button on the annotation view that takes the user to a detail view for the selected annotation. The detail view has a UILabel with the text from the annotation title, a UILabel with the text from the annotation subtitle (the address), a button with the business website, a button with the business phone number, and lastly, a button for getting directions to the address. I'm wanting to take the address from the annotation subtitle so that when the user taps the Get Directions button, it opens up that in the Apple Maps app so they can get directions. My question is, how to I open the maps app with the address in the annotation subtitle?

- (MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    // If it's the user location, return nil
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    // Try to dequeue an existing pin view first
    static NSString *annotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
    pinView.animatesDrop = YES;
    pinView.canShowCallout = YES;

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    // [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    AnnotationDetailView *detail = [[AnnotationDetailView alloc] initWithNibName:nil bundle:nil];
    id<MKAnnotation> ann = [mapView.selectedAnnotations objectAtIndex:0];
    ann = view.annotation;
    detail.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    NSLog(@"%@", ann.title);
    NSLog(@"%@", ann.subtitle);
    detail.annTitle = ann.title;
    detail.annSub = ann.subtitle;
    [self.navigationController pushViewController:detail animated:YES]; 
}

viewDidLoad from AnnotationDetailView

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [ti setText:annTitle];
    [sub setText:annSub];
}

Here is my map view with annotations.

//
//  RSFM.m


#import "RSFM.h"
#import "AnnotationDetailView.h"

@interface RSFM ()

@end

@implementation RSFM
{

}

@synthesize centerCoordinate, coordinate, title, subtitle, marketAnnotation, location;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self)
    {
        self.title = NSLocalizedString(@"Farm Markets", @"Farm Markets");
        // Create location manager object
        locationManager = [[CLLocationManager alloc]init];

        [locationManager setDelegate:self];

        // And we want it to be as accurate as possible regardless of how much time/power it takes
        [locationManager setDesiredAccuracy:kCLLocationAccuracyThreeKilometers];

        // Tell our manager to start looking for its location immediately
        // [locationManager startUpdatingLocation];
    }

    return self;
}
/*
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
{
    centerCoordinate = CLLocationCoordinate2DMake(37.7885, 85.3279);
}
*/
- (void)findLocation
{
    [locationManager startUpdatingLocation];
    [activityIndicator startAnimating];
    // [locationTitleField setHidden:YES];
    [locationManager stopUpdatingLocation];
}

- (void)foundLocation:(CLLocation *)loc
{
    CLLocationCoordinate2D coord = [loc coordinate];

    // Zoom the region to this location
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coord, 700000, 700000);
    [worldView setRegion:region animated:YES];

    // Reset the UI
    // [locationTitleField setText:@""];
    [activityIndicator stopAnimating];
    // [locationTitleField setHidden:NO];
    [locationManager stopUpdatingLocation];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"%@", newLocation);

    // How many seconds ago was this new location created?
    NSTimeInterval t = [[newLocation timestamp]timeIntervalSinceNow];

    // CLLocationManagers will return the last found location of the device first, you don't want that data in this case.
    // If this location was made more than 3 minutes ago, ignore it.
    if (t < -180)
    {
        // this is cached data, you don't want it, keep looking
        return;
    }

    [self foundLocation:newLocation];
}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"Could not find location: %@", error);
}

- (void)dealloc
{
    // Tell the location manager to stop sending us messages
    [locationManager setDelegate:nil];
}
/*
- (IBAction)showDetails:(id)sender
{
    AnnotationDetailView *detail = [[AnnotationDetailView alloc] initWithNibName:nil bundle:nil];
    detail.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    NSLog(@"%@", marketAnnotation.title);
    detail.ti.text = marketAnnotation.title;
    [self.navigationController pushViewController:detail animated:YES];
}
*/
- (MKAnnotationView*)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    // If it's the user location, return nil
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    // Try to dequeue an existing pin view first
    static NSString *annotationIdentifier = @"AnnotationIdentifier";
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
    pinView.animatesDrop = NO;
    pinView.pinColor = MKPinAnnotationColorRed;
    pinView.canShowCallout = YES;

    UIButton *rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    [rightButton setTitle:annotation.title forState:UIControlStateNormal];
    // [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
    pinView.rightCalloutAccessoryView = rightButton;

    return pinView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    AnnotationDetailView *detail = [[AnnotationDetailView alloc] initWithNibName:nil bundle:nil];
    id<MKAnnotation> ann = [mapView.selectedAnnotations objectAtIndex:0];
    // ann = [mapView.selectedAnnotations objectAtIndex:0];
    ann = view.annotation;
    detail.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    NSLog(@"%@", ann.title);
    NSLog(@"%@", ann.subtitle);
    detail.annTitle = ann.title;
    detail.annSub = ann.subtitle;
    // detail.annCoord = ann.coordinate;
    [self.navigationController pushViewController:detail animated:YES];

    /*
    id<MKAnnotation> ann = [mapView.selectedAnnotations objectAtIndex:0];
    CLLocationCoordinate2D coord = ann.coordinate;
    MKPlacemark *placemark = [[MKPlacemark alloc]initWithCoordinate:coord addressDictionary:nil];
    MKMapItem *mapItem = [[MKMapItem alloc]initWithPlacemark:placemark];
    [mapItem openInMapsWithLaunchOptions:nil];
     */
}

- (void)viewDidLoad
{
    [locationManager startUpdatingLocation];
    [worldView setShowsUserLocation:YES];
    [locationManager stopUpdatingLocation];

    NSMutableArray *marketLocations = [[NSMutableArray alloc]init];

    NSMutableArray *lat = [[NSMutableArray alloc]initWithObjects:@"37.7867266", @"37.0703517", @"37.1610806", @"37.318367", @"37.3559204", @"37.4154066", @"37.4757622", @"37.7450252", @"37.6318978", @"37.0716803", nil];

    NSMutableArray *lon = [[NSMutableArray alloc]initWithObjects:@"-87.608209", @"-88.1237899", @"-87.9148629", @"-87.5074402", @"-87.5448032", @"-87.8003148", @"-87.9515986", @"-87.9061638", @"-87.1148574", @"-87.3008418", nil];

    NSMutableArray *title1 = [[NSMutableArray alloc]initWithObjects:@"Cates Farm", @"Broadbent B & B Foods", @"Cayce's Pumpkin Patch", @"Metcalfe Landscaping", @"Brumfield Farm Market", @"Dogwood Valley Farm", @"Country Fresh Meats & Farmers Market", @"Jim David Meats", @"Trunnell's Farm Market", @"Lovell's Orchard & Farm Market", nil];

    NSMutableArray *subtitle1 = [[NSMutableArray alloc]initWithObjects:@"Hwy 425 Henderson, KY 42420", @"257 Mary Blue Road Kuttawa, KY 42055", @"153 Farmersville Road Princeton, KY 42445", @"410 Princeton Road Madisonville, KY 42431", @"3320 Nebo Road Madisonville, KY 42431", @"4551 State Route 109N Clay, KY 42404", @"9355 US Hwy 60 W Sturgis, KY 42459",@"350 T. Frank Wathen Rd. Uniontown, KY 42461", @"9255 Hwy 431 Utica, KY 42376", @"22850 Coal Creek Road Hopkinsville, KY 42240", nil];

    // CLLocationCoordinate2D location;
    // MKPointAnnotation *marketAnnotation;

    for (int x = 0; x < [lat count]; x++)
    {
        marketAnnotation = [[MKPointAnnotation alloc]init];
        location.latitude = [[lat objectAtIndex:x]floatValue];
        location.longitude = [[lon objectAtIndex:x]floatValue];
        marketAnnotation.coordinate = location;
        marketAnnotation.title = [title1 objectAtIndex:x];
        marketAnnotation.subtitle = [subtitle1 objectAtIndex:x];
        [marketLocations addObject:marketAnnotation];
    }

    [worldView addAnnotations:marketLocations];

    /*
    MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
    point.coordinate = CLLocationCoordinate2DMake(37.7867266, -87.608209);
    point.title = @"Cates Farm";
    point.subtitle = @"Hwy 425 Henderson, KY 42420";
    [worldView addAnnotation:point];
     */
}

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    CLLocationCoordinate2D loc = [userLocation coordinate];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(loc, 700000, 700000);
    [worldView setRegion:region animated:YES];
    [locationManager stopUpdatingLocation];
    locationManager.delegate = nil;
}

- (IBAction)selectSegmentControl
{
    int segmentTouched = [mapVarieties selectedSegmentIndex];
    NSString *segmentName = [mapVarieties titleForSegmentAtIndex:segmentTouched];
    if ([segmentName isEqualToString:@"Street"])
    {
        [worldView setMapType:MKMapTypeStandard];
    }
    if ([segmentName isEqualToString:@"Satellite"])
    {
        [worldView setMapType:MKMapTypeSatellite];
    }
    if ([segmentName isEqualToString:@"Hybrid"])
    {
        [worldView setMapType:MKMapTypeHybrid];
    }
}

@end
1
The problem and question are?Wain
My question is, how to I open the maps app with the address in the annotation subtitle?raginggoat

1 Answers

0
votes

You need to use MKMapItem -openInMapsWithLaunchOptions: documented here. You need to first create an MKPlacemark, if you have the required coordinate you can create the placemark directly and if you only have the address you'll need to use the CLGeocoder.