0

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

现在我在注释上有一个标注按钮,该按钮调用一个方法(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 方法,以便它接受 Building 类型的参数,然后我可以在 prepareForSegue 中提供 Building 详细信息,但如果有更好的方法我很想知道。

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

4

1 回答 1

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
于 2012-12-07T13:26:04.640 回答