Displaying custom multiple pins shows wrong pins for locations

后端 未结 1 1362
执念已碎
执念已碎 2021-01-24 00:07

This problem has been bugging me for a couple of weeks already!

I have a tab bar application. On one tab I am entering points, and on another tab, the points are display

相关标签:
1条回答
  • 2021-01-24 00:46

    It sounds like an annotation view re-use issue.

    When the annotations are re-displayed, they are re-using views with the images of previous annotations. The image property in the view is not being updated as it should be when it is re-used for another annotation.

    In the viewForAnnotation delegate method, this code looks wrong:

    MKAnnotationView *annotationView = [mapView dequeue...
    if (annotationView == nil)
        annotationView = myLocation.annotationView;
    else
        annotationView.annotation = annotation;
    

    If the dequeue returns a view (ie. a previously-created view that may have been created for an annotation of a different type), its annotation property is updated but its image property is not updated.

    The existing code only sets the image property when creating a new annotation view (when dequeue returns nil).

    Right now, the annotation view creation and image-setting code is in the annotation model class IGAMapAnnotation. It would be better to create a custom MKAnnotationView class that automatically updates the image property whenever its annotation property is updated.

    However, another alternative is to put all the logic in the viewForAnnotation delegate method itself (and remove the annotationView method from the IGAMapAnnotation class).

    Example of the updated viewForAnnotation delegate method:

    -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        if (! [annotation isKindOfClass:[IGAMapAnnotation class]])
        {
            //return default view if annotation is NOT of type IGAMapAnnotation...
            return nil;
        }
    
    
        MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"IGAMapAnnotation"];
    
        if (annotationView == nil)
        {
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"IGAMapAnnotation"];
            //these properties don't change per annotation 
            //so they can be set only when creating a new view...
            annotationView.enabled = YES;
            annotationView.canShowCallout = YES;
            annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        }
        else
        {
            annotationView.annotation = annotation;
        }
    
    
        //whether we are using a completely new view or a re-used view,
        //set the view's image based on the current annotation...
    
        IGAMapAnnotation *myLocation = (IGAMapAnnotation *) annotation;
        if ([myLocation.type isEqual: @"A"] || [myLocation.type isEqual: @"B"] || [myLocation.type isEqual: @"C"])
        {
            annotationView.image = [UIImage imageNamed:@"circle.png"];
        }
        else if ([myLocation.type isEqual: @"D"])
        {
            annotationView.image = [UIImage imageNamed:@"triangle.png"];
        }
        else if ([myLocation.type isEqual: @"E"])
        {
            annotationView.image = [UIImage imageNamed:@"square.png"];
        }
        else
        {
            annotationView.image = [UIImage imageNamed:@"oval.png"];
        }
    
    
        return annotationView;
    }
    
    0 讨论(0)
提交回复
热议问题