2010-02-24 11 views
6

Ok, quindi in genere si ha qualche oggetto X che si desidera annotare all'interno di un MKMapView. Tu fai in questo modo:Soluzione pulita per sapere quale MKAnnotation è stata intercettata?

DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate: poi.geoLocation.coordinate title: @"My Annotation"]; 
[_mapView addAnnotation: annotation]; 

quindi si crea la vista annotazione all'interno

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation; 

E quando qualche richiamo viene sfruttato, si gestisce l'evento all'interno:

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

Qual è la soluzione più pulita passare X all'ultimo evento tap?

risposta

17

Se sto capendo la tua domanda, dovresti aggiungere un riferimento o una proprietà alla tua classe DDAnnotation in modo che nel tuo metodo calloutAccessoryControlTapped puoi accedere all'oggetto.

@interface DDAnnotation : NSObject <MKAnnotation> { 
    CLLocationCoordinate2D coordinate; 
    id objectX; 
} 
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
@property (nonatomic, retain) id objectX; 

Quando si crea l'annotazione:

DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate:poi.geoLocation.coordinate title: @"My Annotation"]; 
annotation.objectX = objectX; 
[_mapView addAnnotation: annotation]; 

Poi:

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

    DDAnnotation *anno = view.annotation; 
    //access object via 
    [anno.objectX callSomeMethod]; 
} 
+0

Grazie! Non ho notato la proprietà di annotazione dell'interfaccia MKAnnotationView! Questo è quello che stavo cercando! –

0

ho fatto questo e ha funzionato bene!

È esattamente ciò di cui ho bisogno perché avevo bisogno di fare qualcosa quando la mappa veniva toccata, ma lasciando che il rubinetto entrasse nel flusso di annotazioni normalmente.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIGestureRecognizer *g = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)] autorelease]; 
    g.cancelsTouchesInView = NO; 
    [self.mapView addGestureRecognizer:g]; 

} 

- (void) handleGesture:(UIGestureRecognizer*)g{ 
    if(g.state == UIGestureRecognizerStateEnded){ 
     NSSet *visibleAnnotations = [self.mapView annotationsInMapRect:self.mapView.visibleMapRect]; 
     for (id<MKAnnotation> annotation in visibleAnnotations.allObjects){ 
      UIView *av = [self.mapView viewForAnnotation:annotation]; 
      CGPoint point = [g locationInView:av]; 
      if([av pointInside:point withEvent:nil]){ 
       // do what you wanna do when Annotation View has been tapped! 
       return; 
      } 
     } 
     //do what you wanna do when map is tapped 
    } 
} 
Problemi correlati