每次创建新注释 - dequeueReusableAnnotationViewWithIdentifier

时间:2013-07-14 22:56:58

标签: ios annotations mapkit

这是我的代码:

- (MKAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if ([annotation class] == MKUserLocation.class) {
        return nil;
    }
    static NSString *identifier=@"an";

    MKAnnotationView *pinView = nil;

    pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (pinView == nil)
    {
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        pinView.canShowCallout = YES;
        NSLog(@"NEW ONE CREATED");
    }
    else
    {
        pinView.annotation = annotation;
    }

    return pinView;
} 

似乎无效并且pinView总是为零,因为我可以看到每个引脚创建的nslog。

1 个答案:

答案 0 :(得分:2)

两个想法:

  1. 不要以为仅仅因为注释已经滚动离开当前地图视图的当前region,它就会自动出列并立即重新用于另一个注释。 MKMapView很可能会挂起注释视图,而不是立即重用它们。例如,我可以想象一些内部优化可能会挂在地图当前region附近的注释视图中,以防用户滚动地图,以便之前的注释视图现在再次可见。 MKMapView可能希望避免创建和重新创建相同的注释视图,因为用户来回滚动MKMapView

    根据我的经验,在旧的注释视图可供重用之前,您必须滚动一段距离。

  2. 这种情况极不可能,但除了上面的观察之外,我们还应注意您的viewForAnnotation引用了一些外部变量mapView,而不是使用aMapView作为参数传递给方法。很可能这是一个指向相同MKMapView的实例变量,一切都很好,但如果mapView变量是nil,则dequeueReusableAnnotationViewWithIdentifier将始终返回{ {1}}也是。您可能希望更改nil以使用viewForAnnotation参数来消除这种歧义。