Cocoa touch 清洁溶液以了解已点击哪个注释?

Cocoa touch 清洁溶液以了解已点击哪个注释?,cocoa-touch,mkmapview,mkannotation,Cocoa Touch,Mkmapview,Mkannotation,好的,您通常需要在MKMapView中对某个对象X进行注释。您可以这样做: DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate: poi.geoLocation.coordinate title: @"My Annotation"]; [_mapView addAnnotation: annotation]; 然后在内部创建注释视图 - (MKAnnotationView *)mapView:(MKMapVie

好的,您通常需要在MKMapView中对某个对象X进行注释。您可以这样做:

DDAnnotation *annotation = [[DDAnnotation alloc] initWithCoordinate: poi.geoLocation.coordinate title: @"My Annotation"];
[_mapView addAnnotation: annotation];
然后在内部创建注释视图

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

将X传递给最新点击事件的最干净的解决方案是什么?

如果我理解您的问题,您应该向DDAnnotation类添加引用或属性,以便在calloutAccessoryControlTapped方法中您可以访问该对象

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


我这样做了,效果很好

这正是我所需要的,因为当点击地图时,我需要做一些事情,但让点击进入注释流

- (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
    }
 }
-(void)viewDidLoad
{
[超级视图下载];
UIGestureRecognizer*g=[[UITapGestureRecognizer alloc]initWithTarget:自操作:@selector(HandleTesture:)]autorelease];
g、 cancelsTouchesInView=否;
[self.mapView addgesturecognizer:g];
}
-(无效)手持测试:(UIgestureRecognitor*)g{
if(g.state==UIgestureRecognitizerStateEnded){
NSSet*visibleAnnotations=[self.mapView注释sinMaprect:self.mapView.visibleMapRect];
for(visibleAnnotations.AllObject中的id注释){
UIView*av=[self.mapView viewForAnnotation:annotation];
CGPoint点=[g位置视图:av];
if([av pointInside:PointWithEvent:nil]){
//点击注释视图后,执行您想要执行的操作!
返回;
}   
}
//点击地图时做你想做的事
}
}

谢谢!我没有注意到MKAnnotationView界面的annotation属性!这就是我要找的!
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];
}
- (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
    }
 }