问题
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?
回答1:
A couple of thoughts:
In
annotationsLocal
, you are not only instantiatingPinAnnotation
objects and adding them to a map, but you are also instantiatingMKAnnotationView
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).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.
来源:https://stackoverflow.com/questions/33297059/didselectannotationview-called-automatically-when-custom-annotations-are-added-t