Как реализовать несколько выносок в MKPinAnnotationView

#ios

#iOS

Вопрос:

Это мой первый вопрос о переполнении стека, а также я новичок в разработке iOS. Я разрабатываю картографическое приложение для своей школы. в моей школе 25 зданий. У меня есть 25 MKPinAnnotationViews на моей карте.

 - (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id <MKAnnotation>)annotation
{
// if it's the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
    return nil;

// handle our two custom annotations
//
if ([annotation isKindOfClass:[SchureAnnotation class]]) // for Harry Schure Hall
{
    // try to dequeue an existing pin view first
    static NSString* SchureAnnotationIdentifier = @"schureAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [mapView dequeueReusableAnnotationViewWithIdentifier:SchureAnnotationIdentifier];
    if (!pinView)
    {
        // if an existing pin view was not available, create one
        MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
                                               initWithAnnotation:annotation reuseIdentifier:SchureAnnotationIdentifier] autorelease];
        customPinView.pinColor = MKPinAnnotationColorPurple;
        customPinView.animatesDrop = YES;
        customPinView.canShowCallout = YES;

        // add a detail disclosure button to the callout which will open a new view controller page
        //
        // note: you can assign a specific call out accessory view, or as MKMapViewDelegate you can implement:
        //  - (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control;
        //
        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton addTarget:self
                        action:@selector(showDetails:)
              forControlEvents:UIControlEventTouchUpInside];
        customPinView.rightCalloutAccessoryView = rightButton;

        return customPinView;
    }
    else
    {
        pinView.annotation = annotation;
    }
    return pinView;
}
else if ([annotation isKindOfClass:[SaltenAnnotation class]]) // for Salten Hall
{
    // try to dequeue an existing pin view first
    static NSString* SaltenAnnotationIdentifier = @"saltenAnnotationIdentifier";
    MKPinAnnotationView* pinView = (MKPinAnnotationView *)
    [mapView dequeueReusableAnnotationViewWithIdentifier:SaltenAnnotationIdentifier];
    if (!pinView)
    {
        // if an existing pin view was not available, create one
        MKPinAnnotationView* customPinView = [[[MKPinAnnotationView alloc]
                                               initWithAnnotation:annotation reuseIdentifier:SaltenAnnotationIdentifier] autorelease];
 ..........
  

Я хочу поставить другую выноску, чтобы показать ее информацию для каждого pin-кода. Я вызываю функцию showDetails:, которая выглядит следующим образом

 - (void)showDetails:(id)sender
{
// the detail view does not want a toolbar so hide it
[self.navigationController setToolbarHidden:YES animated:NO];

[self.navigationController pushViewController:detailViewController animated:YES];
}
  

Для отображения информации о каждом здании, нужно ли мне написать 25 контроллеров просмотра? или в любом случае можно использовать один контроллер просмотра? Если я нажму на правую кнопку annotationview, он должен показать свою информацию (изображение, текст). Если я нажму на другую аннотацию, она должна показать свою информацию, заменив старую.

Любая помощь приветствуется. Спасибо, Прадип.

Ответ №1:

Не используйте [rightButton addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];

Измените на

[rightButton addTarget:self action:nil forControlEvents:UIControlEventTouchUpInside];

И затем:

Шаг 1:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"TCServiceStationDetailFromMap" sender:view];
}

Шаг 2:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  

{

если ([segue.identifier равен строке:@»TCServiceStationDetailFromMap»]) {

     MKAnnotationView *view = sender;
    TSPlaceMark *detailPlaceMark = (TSPlaceMark *)view.annotation;
    //...
    //so that you can get the different MKAnnotationView  
}
  

}