didSelectAnnotationView在将自定义注释添加到mapView时自动调用

我试图在MKMapView上添加自定义的注释,并在注解中实现自定义callOut view

我跟这个链接是一样的。 问题是,当我添加自定义注释didSelectAnnotationView被自己调用,并显示popOver callout ,即使用户没有点击注释

这是我的代码:

  -(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]; } 

我哪里错了? 我如何解决这个问题?

一些想法:

  1. annotationsLocal ,您不仅实例化PinAnnotation对象并将它们添加到地图中,而且还将实例化MKAnnotationView对象,构build它们的数组,然后返回该数组,然后将该数组作为注释添加到地图视图中。

    MKAnnotationView第二个数组MKAnnotationView不应该被构build,当然不应该被添加为地图视图的注释。 不要混淆注解对象(代表地图上点的坐标)和注解视图对象(它们表示这些注释在地图上呈现时的可视表示)。

  2. viewForAnnotation ,与您的问题无关,您也在viewForAnnotation中实例化不必要的注释视图。 您应该使注解视图出列,并且只有在没有成功检索到要重用的视图时才会实例化一个新视图:

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

但是我没有看到任何会导致didSelectAnnotationView被调用的东西,除非添加注释视图作为注释的不正确过程有一些奇怪的副作用导致了这种情况。 如果你仍然看到didSelectAnnotationView调用,我可能会build议在那里添加一个断点,看看调用堆栈,看看你是否可以看到被调用的地方。 但希望修复annotationsLocal将修复它。