2011-09-07 25 views
9

Tengo un mapa con solo una anotación. Creé una clase simple que quiero mostrar cuando el usuario hace clic en la anotación. El problema es que cuando hago clic en la anotación, nada sucede.mostrar otra vista cuando se hace clic en la anotación de mapa

Aquí está mi código:

- (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]; 
} 

Mi showDetailView función nunca se called.Please ayuda me.I'm nuevo en iPhone y podría olvidar un simple thing.Thanks

Todavía no funciona! !!!

Respuesta

16

En primer lugar, compruebe que se establece lo contrario su método viewForAnnotation no se llamará de delegate la vista del mapa.

A continuación, el accesorio botón aparece en llamada de la anotación que sólo aparecerá si se establece canShowCallout:

annView.canShowCallout = YES; 

A continuación, en lugar de utilizar su propio método para manejar la acción del botón, que es mucho mejor utilizar un método propio calloutAccessoryControlTapped delegado de la vista del mapa, que se llama cuando tocando un accesorio:

- (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 
} 

quitar la línea de [detailButton addTarget...viewForAnnotation.

También tenga en cuenta que su NSLog en el método showDetailView falta el @ principal que dará lugar a un bloqueo cuando se llama el método.

Otra cosa es que debe usar dequeueReusableAnnotationViewWithIdentifier en viewForAnnotation para habilitar la vista de anotación de reutilizar.


Ejemplo conforme a lo solicitado:

- (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]; 
} 
+0

es genial lo que dices pero ¿podrías publicar un código completo, por favor? – adrian

+0

Me encuentro con un problema similar, el NSLog muestra el String por lo que se llama al método 'callOutAccessoryControlTapped', pero no ocurre nada, la vista detallada no se muestra, trabajo con StoryBoards – Malloc

+0

@Malek, no he usado guiones gráficos todavía así que no puedo dar consejos específicos. Deberías preguntar eso como una nueva pregunta. Si se está refiriendo a su última pregunta, debe actualizarla y mencionar que está usando guiones gráficos. – Anna

0

escriba su función como esta:

-(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]; 
} 
+0

¡Todavía no funciona! – adrian

0

Reemplazar -(IBAction)showDetailView:(UIView*)sender con los siguientes ...

-(void)showDetailView:(id)sender 
+0

¡Aún no funciona! – adrian

0

tiene que configurar el mapa delegado al auto como este,

mapview.delegate=self; (si su llamada al método en la misma página)

si no asigna el delegado en su código, no se invocarán los métodos respectivos, por lo tanto, verifique si tiene la línea mencionada anteriormente.

2

Ok.Si está utilizando guiones gráficos, es necesario crear un segue entre el controlador de vista de mapa y, a continuación, donde existe el código de abajo:

- (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]; 
} 

Utilice el código siguiente en su lugar:

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

Esto le dará la movimiento a la vista detallada.

+0

¡Tu código funciona perfecto para mí! Gracias ! – Shinichi

Cuestiones relacionadas