我添加了一个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
方法中时,如何知道我单击了哪个医院对象?帮我迷路
最佳答案
在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”时,实际上是指“字段”或“属性”而不是“记录”(每个医院对象都是一个“记录”)。
以下是解决此问题的几种方法:
在
DetailMap
中,添加类型为hospital
的名为say 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
中声明一个MoreHospitalDetailViewController
属性以传递单个对象。