Apple のLocation and Maps Programming Guideでこのコードに出くわしました:
- (MKAnnotationView *)mapView:(MKMapView *)mapView
viewForAnnotation:(id <MKAnnotation>)annotation
{
// If the annotation is the user location, just return nil.
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
// Handle any custom annotations.
if ([annotation isKindOfClass:[MyCustomAnnotation class]])
{
// Try to dequeue an existing pin view first.
MKPinAnnotationView* pinView = (MKPinAnnotationView*)[mapView
dequeueReusableAnnotationViewWithIdentifier:@"CustomPinAnnotationView"];
if (!pinView)
{
// If an existing pin view was not available, create one.
pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
reuseIdentifier:@"CustomPinAnnotationView"];
pinView.pinColor = MKPinAnnotationColorRed;
pinView.animatesDrop = YES;
pinView.canShowCallout = YES;
// If appropriate, customize the callout by adding accessory views (code not shown).
}
else
pinView.annotation = annotation;
return pinView;
}
return nil;
}
この部分に関して質問があります:
else
pinView.annotation = annotation;
Stackoverflow の回答で同じコードを見ました:
annotation
関係ありませんが、ビューが再利用されている場合 (デキュー後に nil でない場合) 、ビューのプロパティも設定する必要があります。else
にブロックを追加しif (pinAnnotation == nil)
ます。else { //annotation view being re-used, set annotation to current... pinAnnotation.annotation = annotation; }
注釈プロパティがelseブロックに設定されているのはなぜですか? ビューが再利用されたかどうかに関係なく、アノテーションを設定するべきではありませんか?