我添加了annotaion pin point to my application,当用户点击图钉时,弹出窗口显示蓝色箭头(UIButtonTypeDetailDisclosure
)。现在我想要做的是,当用户点击它时,我需要视图重定向到另一个视图,其中包含更多详细信息。
例如:如果是我点击的医院,弹出窗口将提供其名称和UIButtonTypeDetailDisclosure
按钮。当我点击UIButtonTypeDetailDisclosure
按钮时,我应该重定向到另一个视图,该视图会提供有关该医院的更多信息。
我的代码:
-(void)callingMap:(NSArray *)hospitalArray {
for(Hospital *hospital in hospitalArray)
{
MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };
region.center.latitude = hospital.lati;
region.center.longitude = hospital.longi;
[self.mapView setRegion:region animated:YES];
DetailMap *hospitalInfo = [[DetailMap alloc] init];
hospitalInfo.title = [hospital name];
hospitalInfo.subtitle = [hospital address];
hospitalInfo.coordinate = region.center;
[self.mapView addAnnotation:hospitalInfo];
}
}
}
-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:
(id <MKAnnotation>)annotation {
MKAnnotationView* ann = nil;
if(annotation != mapView.userLocation)
{
ann = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"try"];
ann.canShowCallout = YES;
ann.image = [UIImage imageNamed:@"arrow.png"];
UIButton* butt = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[butt addTarget:self action:@selector(displayArrow:) forControlEvents:
UIControlEventTouchUpInside];
ann.rightCalloutAccessoryView = butt;
}
return ann;
}
-(void)displayArrow:(id)sender{
MoreHospitalDetailViewController *mhdvc = [[MoreHospitalDetailViewController alloc] initWithNibName:nil bundle:nil];
mhdvc.hospitalArray = ????????
// in the MoreHospitalDetailViewController i have an Array called hospitalArray. I need to insert the selected hospital object (after clicking the particular arrow) to this array and pass it to the next view. How to do it ? //
[self.navigationController pushViewController:mhdvc animated:YES];
}
在MoreHospitalDetailViewController
我有一个名为hospitalArray
的数组。我需要将选定的hospital object
(在单击特定箭头后)插入此数组并将其传递给下一个视图。怎么做?
注意:地图中可能有很多项目(注释),因此,当我使用(void)displayArrow:(id)sender
方法时,如何知道我点击了哪个医院对象?
帮助我迷失
答案 0 :(得分:2)
在displayArrow:
方法中,您可以获得对使用以下内容点击的注释的引用:
DetailMap *hospitalInfo
= (DetailMap *)[mapView.selectedAnnotations objectAtIndex:0];
请注意,您还可以使用地图视图的calloutAccessoryControlTapped
委托方法,而不是执行addTarget
并编写自定义方法。例如:
-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control
{
DetailMap *hospitalInfo = (DetailMap *)view.annotation;
//do something with the annotation...
}
<小时/> 你有两个班:
Hospital
其中包含医院的详细信息,包括电话号码等DetailMap
实现MKAnnotation
并且只包含医院的坐标,名称和地址(但不包含电话#或其他任何内容)点击注释的标注按钮时,您想要访问完整的医院信息(不仅仅是坐标,名称和地址)。
首先,当您在评论“详细地图中仅包含2条记录”时,您的意思是“字段”或“属性”而不是“记录”(每个医院对象都是“记录”)。
以下是解决此问题的几种方法:
在DetailMap
中,添加名为hospital
的{{1}}类型的属性,并在Hospital
方法中创建DetailMap
个对象时进行设置( callingMap
)。然后在hospitalInfo.hospital = hospital
方法中,您可以将该属性添加到数组(displayArrow:
)。
更改mhdvc.hospitalArray = [NSArray arrayWithObject:hospitalInfo.hospital];
类,使其自身实现Hospital
并完全取消MKAnnotation
类。然后,您可以直接将DetailMap
个对象传递给Hospital
,然后使用addAnnotation
方法执行此操作:
displayArrow:
第一个选项更容易,因为您已经创建了Hospital *hospital = (Hospital *)[mapView.selectedAnnotations objectAtIndex:0];
mhdvc.hospitalArray = [NSArray arrayWithObject:hospital];
类,但第二个选项更清晰。
但是,DetailMap
不需要数组来传递单个医院对象(包含多个字段)。您只需在MoreHospitalDetailViewController
中声明Hospital *hospital
属性即可传递单个对象。