2010-02-24 8 views
6

Ok, Sie haben also normalerweise ein Objekt X, das in einer MKMapView kommentiert werden soll. Sie tun so:Saubere Lösung um zu wissen, welche MKAnnotation angezapft wurde?

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

Dann legen Sie die Anmerkungsansicht innen

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

Und wenn einige callout angezapft wird, können Sie das Ereignis Innengriff:

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

Was die sauberste Lösung ist X an das letzte Tippereignis weitergeben?

Antwort

17

Wenn ich Ihre Frage verstehe, sollten Sie Ihrer DDAnnotation-Klasse einen Verweis oder eine Eigenschaft hinzufügen, damit Sie in Ihrer calloutAccessoryControlTapped-Methode auf das Objekt zugreifen können.

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

Wenn Sie die Anmerkung erstellen:

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

Dann:

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

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

Vielen Dank! Ich habe die Annotationseigenschaft der MKAnnotationView-Schnittstelle nicht bemerkt! Das habe ich gesucht! –

0

ich das tat und es funktionierte gut!

Es ist genau das, was ich brauche, weil ich etwas tun musste, wenn die Karte angetippt wurde, aber den Tipp in die Annotation normal fließen ließ.

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