iOS:如何根据点击的注释加载mapview中的对象?

时间:2012-12-07 13:10:31

标签: ios annotations android-mapview master-detail uicontrol

我有一个带有mapview的应用程序,其中包含各种构建对象(我自己的类)。每个建筑都有一个注释属性,一切都很好,用户可以在表格中搜索所需的建筑物,点击一个按钮,它将显示相关的注释。

现在我在注释上有一个callout按钮,它调用一个方法(showDetails)将一个segue推送到DetailViewController,但我遇到的问题是将正确的建筑物传递给这个DetailViewController。所有建筑物都存储在数据控制器中的一个数组中,如果可能的话,我想从中加载一个。

到目前为止,我已经使用了controlWasTapped方法,我只是简单地说:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

for (Building* theBuilding in self.datacontroller.masterArray){
if(theBuilding.name isEqualToString:view.annotation.title){
    NSLog(@"theBuilding's name %@", theBuilding.name);
}
}

这样可以正常工作并返回正确的建筑物,但我很难知道如何将它送到DetailViewController。我有一个PrepareForSegue方法,但我怎样才能得到正确的建筑物呢?此外,既然我有DidSelectAnnotation,是否需要我的showDetails方法?

我以为我可以修改showDetails方法,以便它接受建筑类型的参数,然后我可以在prepareForSegue中提供建筑细节,但是如果有更好的方式我想知道。

那么,最好的计划是什么?非常感谢

1 个答案:

答案 0 :(得分:0)

在包含您发布的代码的类中声明一个实例变量。

Building *buildingOfInterest;

然后

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

    for (Building* theBuilding in self.datacontroller.masterArray)
        if(theBuilding.name isEqualToString:view.annotation.title) {
              buildingOfInterest = theBuilding;
              [self performSegueWithIdentifier:@"ShowBuildingSegue" sender:self];
              break;
    }
}

然后:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     if ([[segue identifier] isEqualToString:@"ShowBuildingSegue"])
         ((MyBuildingVC *)segue.destinationViewController).building = buildingOfInterest;
}

并在目标视图控制器的头文件中:

@interface MyBuildingVC : UIViewController
@property (strong) Building * building;
@end