添加UIButtonTypeDetailDisclosure - 逻辑问题

时间:2012-02-02 15:03:46

标签: iphone objective-c

我添加了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方法时,如何知道我点击了哪个医院对象?

帮助我迷失

1 个答案:

答案 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属性即可传递单个对象。