这是我的代码:
- (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。
答案 0 :(得分:2)
两个想法:
不要以为仅仅因为注释已经滚动离开当前地图视图的当前region
,它就会自动出列并立即重新用于另一个注释。 MKMapView
很可能会挂起注释视图,而不是立即重用它们。例如,我可以想象一些内部优化可能会挂在地图当前region
附近的注释视图中,以防用户滚动地图,以便之前的注释视图现在再次可见。 MKMapView
可能希望避免创建和重新创建相同的注释视图,因为用户来回滚动MKMapView
。
根据我的经验,在旧的注释视图可供重用之前,您必须滚动一段距离。
这种情况极不可能,但除了上面的观察之外,我们还应注意您的viewForAnnotation
引用了一些外部变量mapView
,而不是使用aMapView
作为参数传递给方法。很可能这是一个指向相同MKMapView
的实例变量,一切都很好,但如果mapView
变量是nil
,则dequeueReusableAnnotationViewWithIdentifier
将始终返回{ {1}}也是。您可能希望更改nil
以使用viewForAnnotation
参数来消除这种歧义。