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

时间:2015-10-23 07:33:42

标签: ios mkmapview mkannotationview

我尝试在MKMapView上添加自定义注释,并在点击注释时实现自定义callOut view

关注相同的this链接。问题是当我添加自定义注释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 个答案:

答案 0 :(得分:0)

有几点想法:

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

    第二个MKAnnotationView数组根本不应该构建,当然也不应该作为地图视图的注释添加。不要混淆注释对象(表示地图上点的坐标)和注释视图对象(表示这些注释在地图上呈现时的可视化表示)。

  2. 除此之外,与您的问题无关,您也在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;
    }
    
  3. 但是我没有在这里看到任何会导致didSelectAnnotationView被调用的内容,除非将注释视图添加为注释的错误过程产生了一些奇怪的副作用导致了这一点。如果您仍然看到didSelectAnnotationView被调用,我可能会建议在那里添加断点并查看调用堆栈,看看您是否可以看到调用它的位置。但希望修复annotationsLocal将解决它。