我有一个带有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中提供建筑细节,但是如果有更好的方式我想知道。
那么,最好的计划是什么?非常感谢
答案 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