показать другой вид при нажатии на аннотацию карты - PullRequest
9 голосов
/ 07 сентября 2011

У меня есть карта только с одной аннотацией. Я создал простой класс, который я хочу, чтобы он отображал, когда пользователь нажимает на аннотацию. Проблема в том, что при нажатии на аннотацию ничего не происходит.

Вот мой код:

- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark{
    NSLog(@"Reverse Geocoder completed");
    mPlacemark=placemark;
    [mapView addAnnotation:placemark];
}

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"];
    annView.animatesDrop=TRUE;

    //create UIButton for annotation
    UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    //NSInteger annotationValue = [self.annotations indexOfObject:annotation];

    [detailButton addTarget:self action:@selector(showDetailView:) forControlEvents:UIControlEventTouchUpInside];
    annView.rightCalloutAccessoryView=detailButton;
    return annView;
}


-(void)showDetailView:(id)sender{
    NSLog("inside the stupid method");
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}

Моя showDetailView функция никогда не вызывается. Пожалуйста, помогите мне. Я новичок в iphone, и я мог бы забыть простую вещь. Спасибо

Все еще не работает !!!!

Ответы [ 5 ]

16 голосов
/ 07 сентября 2011

Во-первых, убедитесь, что delegate вида карты установлен, иначе ваш viewForAnnotation метод не будет вызван.

Далее, дополнительная кнопка появляется на аннотации callout , которая появится только если вы установите canShowCallout:

annView.canShowCallout = YES;

Далее, вместо использования собственного метода для обработки действия кнопки, гораздо лучше использовать собственный метод делегата вида карты calloutAccessoryControlTapped, который вызывается при нажатии на аксессуар:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"inside the stupid method");

    //Here, the annotation tapped can be accessed using view.annotation
}

Удалить строку [detailButton addTarget... из viewForAnnotation.

Также обратите внимание, что в вашем NSLog в методе showDetailView отсутствует ведущий @, что приведет к сбою при вызове метода.

Другое дело, что вы должны использовать dequeueReusableAnnotationViewWithIdentifier в viewForAnnotation для повторного использования представления аннотаций.


Пример по запросу :

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation
{
    static NSString *annReuseId = @"currentloc";

    MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annReuseId];
    if (annView == nil)
    {
        annView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annReuseId];

        annView.animatesDrop = YES;
        annView.canShowCallout = YES;

        UIButton *detailButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annView.rightCalloutAccessoryView=detailButton;
    }
    else {
        annView.annotation = annotation;
    }

    return annView;
}

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation);
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
    //here, can set annotation info in some property of detailView
    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}
2 голосов
/ 28 мая 2012

Хорошо.Если вы используете раскадровки, вам нужно создать переход между контроллером представления карты, а затем там, где существует следующий код:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation);
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
    //here, can set annotation info in some property of detailView
    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}

Вместо этого используйте следующий код:

NSLog(@"calloutAccessoryControlTapped: annotation = %@", view.annotation);
[self performSegueWithIdentifier:@"DetailViewController" sender:self];

Этодаст вам движение к подробному виду.

0 голосов
/ 22 сентября 2011

Вы должны установить делегата карты на себя, как это,

mapview.delegate=self; (если вы вызываете метод на той же странице)

если вы не назначаете делегата в своем коде, соответствующие методы не будут вызываться, поэтому проверьте, есть ли у вас вышеупомянутая строка.

0 голосов
/ 07 сентября 2011

Заменить -(IBAction)showDetailView:(UIView*)sender следующим ...

    -(void)showDetailView:(id)sender
0 голосов
/ 07 сентября 2011

напишите свою функцию так:

-(IBAction)showDetailView:(id)sender{
    NSLog("inside the stupid method");
    MyDetailViewController *detailView=[[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil];
    [[self navigationController] pushViewController:detailView animated:YES];
    [detailView release];
}
...