Чистое решение, чтобы узнать, какой MKAnnotation был использован? - PullRequest
6 голосов
/ 25 февраля 2010

Хорошо, поэтому у вас обычно есть какой-то объект X, который вы хотите аннотировать внутри MKMapView. Вы делаете это так:

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 последнему событию касания?

Ответы [ 2 ]

17 голосов
/ 26 февраля 2010

Если я понимаю ваш вопрос, вы должны добавить ссылку или свойство в свой класс 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 голосов
/ 23 октября 2012

Я так и сделал, и все заработало!

Это как раз то, что мне нужно, потому что мне нужно было что-то сделать, когда карта была нажата, но позволяла переключиться в аннотацию как обычно.

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