How to call a segue from a disclosure button on a map pin?

I have an app that plots pins on a mapview.

Each pin uses this code to display a detail disclosure button, which when tapped calls a showDetail method which then calls the prepareForSegue method. Im thinking there is a lot of extra work here.

  • Stop speech recognition when user is finished speaking
  • Sequence animation using CAAnimationGroup
  • UILabel justify left and right
  • How to filter quickblox user based on his phone number?
  • Integrate Swift framework to objective-c application
  • Core Data inheritance vs no inheritance
  • Should I eliminate the showDetail and just call the prepareForSegue method? but how would I pass in the MyLocation object?

    Here is the code:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
        static NSString *identifier = @"MyLocation";
        if ([annotation isKindOfClass:[MyLocation class]]) {
    
            //test if mapviewnil
            if (_mapView == nil) {
                NSLog(@"NIL");
            }
            MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [_mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
            if (annotationView == nil) {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
            } else {
                annotationView.annotation = annotation;
            }
    
            annotationView.enabled = YES;
            annotationView.canShowCallout = YES;
            annotationView.image=[UIImage imageNamed:@"locale.png"];
    
    
            //instatiate a detail-disclosure button and set it to appear on right side of annotation
            UIButton *infoButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            [infoButton addTarget:self action:@selector(showDetailView:annotation:) forControlEvents:UIControlEventTouchUpInside];
            annotationView.rightCalloutAccessoryView = infoButton;
    
            return annotationView;
        }
    
        return nil;
    }
    
    -(void)showDetailView:(id <MKAnnotation>)annotation{
    
        //Set the data
        MyLocation *sendingLocation = annotation;
    
        DetailViewController *destinationViewController = segue.destinationViewController;
        destinationViewController.receivedLocation = sendingLocation;
        [self performSegueWithIdentifier: @"DetailVC" sender: self];
    
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
        if ([segue.identifier isEqualToString:@"DetailVC"]) {
            NSLog(@"DetailVC called");
        } else {
            NSLog(@"PFS:something else");
        }
    }
    

    Thx in advance!

    Solutions Collect From Internet About “How to call a segue from a disclosure button on a map pin?”

    Usually you’d not add a target for the button, but rather just set the rightCalloutAccessoryView (like you have) and then write a calloutAccessoryControlTapped method, e.g.:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
        static NSString *identifier = @"MyLocation";
        if ([annotation isKindOfClass:[MyLocation class]]) {
    
            MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
            if (annotationView == nil) {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
                annotationView.enabled = YES;
                annotationView.canShowCallout = YES;
                annotationView.image = [UIImage imageNamed:@"locale.png"]; // since you're setting the image, you could use MKAnnotationView instead of MKPinAnnotationView
                annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
            } else {
                annotationView.annotation = annotation;
            }
    
            return annotationView;
        }
    
        return nil;
    }
    
    - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
    {
        if (![view.annotation isKindOfClass:[MyLocation class]])
            return;
    
        // use the annotation view as the sender
    
        [self performSegueWithIdentifier:@"DetailVC" sender:view];
    }
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(MKAnnotationView *)sender
    {
        if ([segue.identifier isEqualToString:@"DetailVC"]) 
        {
            DetailViewController *destinationViewController = segue.destinationViewController;
    
            // grab the annotation from the sender
    
            destinationViewController.receivedLocation = sender.annotation;
        } else {
            NSLog(@"PFS:something else");
        }
    }