didSelectAnnotationView called automatically when custom annotations are added to mapView
Asked Answered
P

1

0

Am trying to add custom annotations on MKMapView and implement custom callOut view on tap of annotation.

Am following this link for the same. The issue is when I add the custom annotation didSelectAnnotationView is called on its own and the popOver callout is shown, even when the user has not clicked the annotation

Here is my code:

    -(void)callAddAnnotationsLocal{
    [_mapView removeAnnotations:[_mapView annotations]];

    CLLocationCoordinate2D coord = {.latitude =  43.3998170679, .longitude =  -95.1288472486};

     [_mapView addAnnotations:[self annotationsLocal]];

}

    -(NSArray *)annotationsLocal{
    self.annotArrayLocal = nil;
    self.annotArrayLocal = [[NSMutableArray alloc] init];
    for (int i=0; i<[arrAmmenities count];i++)
    {
        MKAnnotationView *propertyAnnotation = [[MKAnnotationView alloc] init];
        UIFont *font = [UIFont fontWithName:@"Arial" size:18];
        NSDictionary *userAttributes = @{NSFontAttributeName: font,
                                         NSForegroundColorAttributeName: [UIColor blackColor]};
        NSString *latStr = [NSString stringWithFormat:@"%@",[[arrAmmenities  objectAtIndex:i]objectForKey:@"latitude"]];
        float latitude = [latStr floatValue];
        NSString *longStr = [NSString stringWithFormat:@"%@",[[arrAmmenities  objectAtIndex:i]objectForKey:@"longitude"]];
        float longitude = [longStr floatValue];
        CLLocationCoordinate2D coord = {.latitude =  latitude, .longitude =  longitude};
        PinAnnotation * annotation = [[PinAnnotation alloc] init];
        [annotation setCoordinate:coord];
        [annotation setType:[[arrAmmenities objectAtIndex:i] objectForKey:@"category"]];
        [annotation setTag:i];
        [self.mapView addAnnotation:annotation];

        [self.annotArrayLocal addObject:propertyAnnotation];
    }
    return _annotArrayLocal;

}

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation {
    MKAnnotationView *annotationView;
    NSString *identifier;

        if ([annotation isKindOfClass:[PinAnnotation class]]) {
            // Pin annotation.
            identifier = @"Pin";
            annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];

                if([[(PinAnnotation *)annotation type] isEqualToString:@"Gas Stations"])
                    annotationView.image = [UIImage imageNamed:@"marker_gas"];
                else if([[(PinAnnotation *)annotation type] isEqualToString:@"Golf Courses"])
                    annotationView.image = [UIImage imageNamed:@"marker_golf"];
                else if([[(PinAnnotation *)annotation type] isEqualToString:@"Restaurants"])
                    annotationView.image = [UIImage imageNamed:@"marker_restaurant"];
                else
                    annotationView.image = [UIImage imageNamed:@"marker_hospital"];

            annotationView.canShowCallout = NO;
        }
    return annotationView;

}



 -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
//    [mapView deselectAnnotation:view.annotation animated:YES];

    MapAnnotViewController *controller = [[UIStoryboard storyboardWithName:@"MapStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"sidMapAnnotVC"];
//    controller.annotation = view.annotation; // it's useful to have property in your view controller for whatever data it needs to present the annotation's details

    wyPopController = [[WYPopoverController alloc] initWithContentViewController:controller];
    wyPopController.delegate = self;
    [wyPopController setPopoverContentSize:CGSizeMake(200.0, 100.0)];

    [wyPopController presentPopoverFromRect:view.frame
                                  inView:view.superview
                permittedArrowDirections:WYPopoverArrowDirectionAny
                                animated:YES];
}

Where am I getting wrong? How do I solve this?

Pharaoh answered 23/10, 2015 at 7:33 Comment(0)
K
0

A couple of thoughts:

  1. In annotationsLocal, you are not only instantiating PinAnnotation objects and adding them to a map, but you are also instantiating MKAnnotationView objects, building an array of them, and then returning that array, which is then added as annotations to the map view.

    That second array of MKAnnotationView should not be built at all, and certainly shouldn't be added as annotations of the map view. Don't conflate annotation objects (which represent the coordinates of points on a map) and annotation view objects (which represent visual representation of those annotations as they are rendered on the map).

  2. As an aside, and unrelated to your problem, you are instantiating unnecessary annotation views in viewForAnnotation, too. You should dequeue an annotation view, and only instantiate a new one if you didn't successfully retrieve one that was to be reused:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id < MKAnnotation >)annotation {
        MKAnnotationView *annotationView;
    
        if ([annotation isKindOfClass:[PinAnnotation class]]) {
            // Pin annotation.
            NSString *identifier = @"Pin";
            annotationView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
            if (annotationView) {
                annotationView.annotation = annotation
            } else {
                annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
                annotationView.canShowCallout = NO;
            }
    
            if ([[(PinAnnotation *)annotation type] isEqualToString:@"Gas Stations"])
                annotationView.image = [UIImage imageNamed:@"marker_gas"];
            else if([[(PinAnnotation *)annotation type] isEqualToString:@"Golf Courses"])
                annotationView.image = [UIImage imageNamed:@"marker_golf"];
            else if([[(PinAnnotation *)annotation type] isEqualToString:@"Restaurants"])
                annotationView.image = [UIImage imageNamed:@"marker_restaurant"];
            else
                annotationView.image = [UIImage imageNamed:@"marker_hospital"];
        }
    
        return annotationView;
    }
    

But I'm not seeing anything here that would cause didSelectAnnotationView to be called, unless that incorrect process of adding annotation views as annotations had some weird side effect that caused this. If you're still seeing didSelectAnnotationView called, I might suggest adding a breakpoint there and looking at the call stack and seeing if you can see where that was being invoked. But hopefully the fixing of annotationsLocal will fix it.

Kolo answered 23/10, 2015 at 15:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.