我添加了一个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属性以传递单个对象。

10-08 18:31