2009-10-21 4 views
18

Sto utilizzando uno MKMapView contenente un paio di pin MKAnnotation.
Sopra la mappa Sto mostrando uno UITableView con informazioni dettagliate sui pin MKAnnotation.MKMapView: Ottieni evento su clic sul pin di annotazione

Il mio problema: quando seleziono un pin, desidero selezionare la cella della tabella corrispondente. Per questo mi piacerebbe prendere un evento/delegato se il pin è selezionato. Non sto parlando di chiamare l'accessorio callout

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 

risposta

1

Non ho visto un modo semplice per farlo in MapKit. Non c'è mapView:annotationWasTapped: sul delegato.

Un modo per farlo sarebbe quello di fornire la propria sottoclasse vista di annotazione. La vista annotazione personalizzata può acquisire la selezione pin in setSelected:animated: o in un gestore eventi di livello inferiore e passare tali informazioni al controller di visualizzazione.

+0

Oh, suona bene e sembra non essere molto lavoro! Grazie! – squeezer123

+0

Così facevo anche io. Strano che Apple non abbia fornito alcuna callback per questo:/ – yonel

3

è possibile utilizzare un osservatore per Selected-evento:

[pin addObserver:self 
     forKeyPath:@"selected" 
     options:NSKeyValueObservingOptionNew 
     context:@"ANSELECTED"]; 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 

    NSString *action = (NSString*)context; 

    if([action isEqualToString:@"ANSELECTED"]){ 

     BOOL annotationAppeared = [[change valueForKey:@"new"] boolValue]; 
     if (annotationAppeared) { 
      // clicked on an Annotation 
     } 
     else { 
      // Annotation disselected 
     } 
    } 
} 
42

Solo un aggiornamento a questo - in iOS 4 ci sono metodi MKMapViewDelegate che possono essere utilizzati per monitorare la selezione e l'annotazione de-selezione:

- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view 
+4

Se vuoi sapere se l'utente fa clic su un'annotazione espansa/selezionata puoi controllare view.selected == YES in didSelectAnnotationView – nylund