当单击DetailDesclosurebutton时MKAnnotationView推送到视图控制器

我想在我正在显示的地图上单击DetailDisclosure时切换视图。 我目前的代码如下:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; detailViewController.title = dictionary[@"placeLatitude"] [self.navigationController pushViewController:detailViewController animated:YES]; } 

我可以推到视图控制器,但我还没有想出如何强制它从用于生成地图的JSON数组中的细节。 我拉这样的数据来生成地图:

  for (NSDictionary *dictionary in array) { // retrieve latitude and longitude from the dictionary entry location.latitude = [dictionary[@"placeLatitude"] doubleValue]; location.longitude = [dictionary[@"placeLongitude"] doubleValue]; //CAN I LOAD THE TITLE/ID OF THE LOCATION HERE? 

我知道我有点偏离目标。 也许只是在正确的方向踢一脚也许有帮助。 谢谢!

如果您正在使用故事板,并且从当前场景到目标场景,可以只响应calloutAccessoryControlTapped 。 例如:

 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { [self performSegueWithIdentifier:@"Details" sender:view]; } 

很明显,如果你想为不同的注解types调用不同的段落,你可以检查与该view等相关的注解types。

当然,如果你想像往常一样将prepareForSegue任何信息传递给下一个场景。

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"Details"]) { MKAnnotationView *annotationView = sender; [segue.destinationViewController setAnnotation:annotationView.annotation]; } } 

正如你所看到的,我将annotation对象传递给下一个视图。 如果您的JSON结构中有与每个注释关联的其他字段,则一个简单的解决scheme是将属性添加到与要跟踪的每个字段关联的自定义视图。 只需转到注释自定义类的.h,并添加所需的属性。 然后,当您创build自定义注释(要添加到地图)时,只需设置这些属性。 然后,当你将这个注解传递给下一个视图控制器的时候,你所需要的所有属性都可以在那里使用。


显然,如果您使用的是NIB,只需执行NIB等价物来实例化下一个视图控制器,设置您想要的任何属性,并推送它或以模态方式呈现它,例如:

 - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { DetailsViewController *controller = [[DetailsViewController alloc] initWithNibName:nil bundle:nil]; controller.annotation = annotationView.annotation; [self.navigationController pushViewController:controller animated:YES]; // or use presentViewController if you're using modals }