如何从地图引脚上的披露按钮调用segue?

我有一个应用程序,在mapview上绘制引脚。

每个引脚都使用此代码来显示详细信息披露按钮,在点击时调用showDetail方法然后调用prepareForSegue方法。 我觉得这里有很多额外的工作。

我应该消除showDetail并只调用prepareForSegue方法吗? 但是我如何传递MyLocation对象?

这是代码:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )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 )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提前!

通常你不会为按钮添加目标,而只是设置rightCalloutAccessoryView (就像你有的那样),然后编写一个calloutAccessoryControlTapped方法,例如:

 - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )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"); } }