2010-02-24 78 views
6

好吧,所以你通常有一個對象X你想在MKMapView中註釋。你這樣做的方式:乾淨的解決方案知道哪個MKAnnotation已被挖掘?

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

然後創建內部

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

與註解視圖時,一些標註被竊聽,你處理內部事件:

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

什麼是乾淨的解決方案將X傳遞給最新的點擊事件?

回答

17

如果我理解你的問題,你應該添加一個引用或屬性到你的DDAnnotation類,以便在你的calloutAccessoryControlTapped方法中你可以訪問該對象。

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

當您創建註釋:

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

然後:

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

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

謝謝!我沒有注意到MKAnnotationView接口的註解屬性!這就是我一直在尋找的! – 2010-02-26 15:06:34

0

我這樣做,它的工作好了!

這正是我所需要的,因爲我需要做一些事情,當地圖被挖掘,但讓正常的流量注入流量。

- (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 
    } 
} 
相關問題