2010-02-24 12 views
6

Ok, więc zazwyczaj masz jakiś obiekt X, który chcesz opisać w widoku MKMapView. Robisz tak:Czyste rozwiązanie, aby dowiedzieć się, które MKAnnotation zostało wykorzystane?

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

Następnie należy utworzyć widok adnotacji wewnątrz

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

a gdy niektóre objaśnienie zostanie wykorzystany, obsługiwać zdarzenia wewnątrz:

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

Jaka jest najczystszym rozwiązanie przekazać X do ostatniego wydarzenia z kranu?

Odpowiedz

17

Jeśli rozumiem twoje pytanie, powinieneś dodać odwołanie lub właściwość do klasy DDAnnotation, aby w metodzie calloutAccessoryControlTapped uzyskać dostęp do obiektu.

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

Podczas tworzenia adnotacji:

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

wówczas:

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

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

Dzięki! Nie zauważyłem właściwości adnotacji interfejsu MKAnnotationView! Tego właśnie szukałem! –

0

Zrobiłem to i to działało w porządku!

Jest to dokładnie to, czego potrzebuję, ponieważ musiałem coś zrobić, gdy mapa została dotknięta, ale pozwalając, by kran w adnotację płynął normalnie.

- (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 
    } 
} 
Powiązane problemy