I am opening the Detailview on annotation pin as well as on tableview. To get direction from detailview I have place following button click event.
Edited:: with -(IBAction)showDirectionUpdated; coding
-(IBAction)showDirectionUpdated;
{
NSIndexPath *selectedIndexPath = [self._tableView indexPathForSelectedRow];
if( selectedIndexPath == [self._tableView indexPathForSelectedRow])
{
marker *aMarker = (marker *)[appDelegate.markers objectAtIndex:selectedIndexPath.row];
NSString *EndLoc=[NSString stringWithFormat:@"%@ %@", aMarker.address,aMarker.city];
NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=Current Location&daddr=%@",EndLoc];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
NSLog(@"%@",url);
[url release];
[self._tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}
else
{
//here if I am opening the detailview from annotation callout button and calling
// direction in map default app. But respective address is not passing
//in default map app
NSInteger selectedIndex = [sender tag];
AddressAnnotation *selectedObject = [self.annobjs objectAtIndex:selectedIndex];
marker *aMarker = [appDelegate.markers objectAtIndex:selectedIndex];
NSString *EndLoc=[NSString stringWithFormat:@"%@ %@", aMarker.address,aMarker.city];
NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=Current Location&daddr=%@",EndLoc];
NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
[[UIApplication sharedApplication] openURL:url];
NSLog(@"%@",url);
[url release];
}
}
I want to pass some sender or id to call respective Direction from detailView which I get on pressing annotation. I am successful with getting direction default app from detailview which I get by selecting tableview(listview). Here some code of sender tag.
Edited 2=== with viewForAnnotation
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{ MKAnnotationView *annView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@""];
if (annView == nil)
{
annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@""] autorelease];
annView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
}
annView.image = [UIImage imageNamed:@"flag.png"];
annView.annotation = annotation;
[annView setEnabled:YES];
[annView setCanShowCallout:YES];
return annView;
}
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
NSLog(@"calloutAccessoryControlTapped");
MKAnnotationView* annView = (MKAnnotationView*) view;
AddressAnnotation* annotation = (AddressAnnotation*)[annView annotation];
if(BcardView.hidden == YES)
{
SearchView.hidden = YES;
BcardView.hidden = NO;
BackButtontitle.text = @"Map View";
marker *aMarker = [[marker alloc]init];
ShowroomName.text = aMarker.name;
}}
Based on the code posted, here is my understanding:
marker
is the top-level class that stores all the details about a location includingaddress
andcity
.AddressAnnotation
is the class that implements theMKAnnotation
protocol currently containing just the coordinate, title, and subtitle for a location (it does not have theaddress
andcity
). This is the class used to create objects that are passed to the map view'saddAnnotation
method.What you would like to do is that when the callout button is pressed on an annotation, you would like to show some detail view or information that requires the
address
andcity
.Instead of trying to keep track of array indexes using tags or searching for objects in arrays, I suggest adding a reference to the
marker
inAddressAnnotation
. This way, when you have anAddressAnnotation
object, you can get its relatedmarker
object using that reference (no searching or indexes needed).In the
AddressAnnotation
class, add a retain property of typemarker
calledparentMarker
. When you create anAddressAnnotation
object from amarker
and before callingaddAnnotation
, set theparentMarker
property to the currentmarker
.Then in
calloutAccessoryControlTapped
, castview.annotation
to anAddressAnnotation
to get easy access to theparentMarker
property. Now you can get theaddress
andcity
from the marker. (By the way, in that method you don't need to castview
toMKAnnotationView
since it already is one and you don't have to name itannView
.)I am not sure what
BcardView
is and why you're checking if it's hidden or not.I'd also suggest a slight improvement to the
viewForAnnotation
method (use a non-blank re-use id and move the setting of the properties that don't change to inside theif
):