0

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ブロックに設定されているのはなぜですか? ビューが再利用されたかどうかに関係なく、アノテーションを設定するべきではありませんか?

4

1 に答える 1

0

MKPinAnnotationViewアノテーションで を初期化して、else を 2 回設定しないようにします。2 回設定してもまったく問題ありませんが、もちろん非効率的です。

于 2016-02-10T15:25:53.430 に答える