为什么我的自定义注释图像会发生变化?

Why are my custom annotation images changing?

我有 21 张不同的图像用于地图上的自定义注释。当我最初加载地图时,一切都很完美。当我离开该区域并返回时,图像似乎发生了变化。注释图钉不再与正确的图像相对应(但是当我按下注释时标题和副标题仍然正确)。就像图像突然混淆了一样。顺便说一句,我只是将测试信息输入 NSUserDefaults 并使用它来测试在地图上显示自定义注释的功能。我假设它与注释视图的可重用性有关,但我无法正确编写代码。

MapViewController.h

#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface MapViewController : ViewController<MKMapViewDelegate>
{
    NSUserDefaults *defaults;
    NSMutableArray *reportedSightings;
}

@property (strong, nonatomic) IBOutlet MKMapView *mapView;

@end

MapViewController.m

#import "MapViewController.h"
@import CoreLocation;

@interface MapViewController ()<CLLocationManagerDelegate>

@property (strong, nonatomic) CLLocationManager *locationManager;

@end

@implementation MapViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    defaults = [NSUserDefaults standardUserDefaults];
    reportedSightings = [[NSMutableArray alloc] init];


    [reportedSightings addObject:@"turtle1,44.008897,-77.743073"];
    [reportedSightings addObject:@"turtle2,43.997620,-77.675193"];
    [reportedSightings addObject:@"turtle3,44.001554,-77.689685"];
    [reportedSightings addObject:@"turtle4,43.992655,-77.712643"];
    [reportedSightings addObject:@"turtle5,44.005708,-77.725666"];

    [reportedSightings addObject:@"snake1,43.993950,-77.720637"];
    [reportedSightings addObject:@"snake2,43.994176,-77.717224"];
    [reportedSightings addObject:@"snake3,43.998308,-77.677515"];
    [reportedSightings addObject:@"snake4,44.007523,-77.719716"];
    [reportedSightings addObject:@"snake5,43.997320,-77.731911"];
    [reportedSightings addObject:@"snake6,43.995390,-77.716450"];

    [reportedSightings addObject:@"amphibian1,43.996503,-77.694154"];
    [reportedSightings addObject:@"amphibian2,43.989638,-77.704582"];
    [reportedSightings addObject:@"amphibian3,44.009406,-77.738130"];
    [reportedSightings addObject:@"amphibian4,44.001059,-77.733429"];
    [reportedSightings addObject:@"amphibian5,44.005405,-77.713410"];
    [reportedSightings addObject:@"amphibian6,44.002750,-77.699245"];
    [reportedSightings addObject:@"amphibian7,43.999160,-77.692886"];
    [reportedSightings addObject:@"amphibian8,43.993869,-77.722742"];
    [reportedSightings addObject:@"amphibian9,43.995589,-77.714681"];
    [reportedSightings addObject:@"amphibian10,43.998462,-77.675608"];


    [defaults setObject:reportedSightings forKey:@"reportedSightings"];
    [defaults synchronize];
    reportedSightings = [NSMutableArray arrayWithArray:[defaults objectForKey:@"reportedSightings"]];



    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;

    // Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
    if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])
        [self.locationManager requestWhenInUseAuthorization];

    [self.locationManager startUpdatingLocation];
    self.mapView.showsUserLocation = YES;

    MKCoordinateRegion region = {{0.0, 0.0}, {0.0, 0.0}};
    region.center.latitude = 43.998564;
    region.center.longitude = -77.709888;

    [self.mapView setRegion:region];



    for(int i=0; i<reportedSightings.count; i++)
    {
        NSString *reportedSighting = reportedSightings[i];
        NSString *speciesName = [reportedSighting substringToIndex:[reportedSighting rangeOfString:@","].location];
        reportedSighting = [reportedSighting substringFromIndex:[reportedSighting rangeOfString:@","].location+1];
        NSString *sightingLatitude = [reportedSighting substringToIndex:[reportedSighting rangeOfString:@","].location];
        reportedSighting = [reportedSighting substringFromIndex:[reportedSighting rangeOfString:@","].location+1];
        NSString *sightingLongitude = reportedSighting;


        float latitude = [sightingLatitude floatValue];
        float longitude = [sightingLongitude floatValue];
        CLLocationCoordinate2D reportedSightingCoordinates = CLLocationCoordinate2DMake(latitude, longitude);


        MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
        point.coordinate = reportedSightingCoordinates;
        point.title = speciesName;
        point.subtitle = [NSString stringWithFormat:@"%f, %f", latitude, longitude];
        [self.mapView addAnnotation:point];

    } 
}



- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if ([self.mapView respondsToSelector:@selector(camera)])
    {
        MKMapCamera *newCamera = [[self.mapView camera] copy];

        [newCamera setPitch:0.0];
        [newCamera setHeading:307.197710];
        [newCamera setAltitude:14515.983058];

        [self.mapView setCamera:newCamera animated:YES];
    }
}


- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    if([annotation isKindOfClass:[MKPointAnnotation class]])
    {
        MKAnnotationView *pinView = (MKAnnotationView*)[self.mapView dequeueReusableAnnotationViewWithIdentifier:@"CustomViewAnnotation"];

        if(!pinView)
        {
            pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomViewAnnotation"];
            pinView.canShowCallout = YES;
            pinView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@Annotation", [annotation title]]];
        }

        else
        {
            pinView.annotation = annotation;
        }

        return pinView;
    }

    return nil;
}


@end

对于此部分:

    if(!pinView)
    {
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomViewAnnotation"];
        pinView.canShowCallout = YES;
        pinView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@Annotation", [annotation title]]];
    }

    else
    {
        pinView.annotation = annotation;
    }

添加行:

pinView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@Annotation", [annotation title]]];

还有其他的,所以看起来像这样:

if(!pinView)
    {
        pinView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CustomViewAnnotation"];
        pinView.canShowCallout = YES;
        pinView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@Annotation", [annotation title]]];
    }

    else
    {
        pinView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@Annotation", [annotation title]]];
        pinView.annotation = annotation;
    }