JSONparsing后–viewForAnnotation在MKMapView上只显示一个单一的注解

我需要在我的MkMapView上显示大约10个位置(和相应的注释),按下button之后,我需要根据不同的JSONparsing结果添加新的不同注释(例如locationIDValue <100表示​​红色针,否则为绿色)。 这是简化的代码:

- (void)viewDidLoad { [super viewDidLoad]; map.showsUserLocation = true; map.mapType = MKMapTypeStandard; arrayID = [[NSMutableArray alloc] initWithObjects: @"id1", @"id2", @"id3", @"id4", @"id5", @"id6", @"id7", @"id8", @"id9", @"id10", nil]; #define MakeLocation(lat,lon) [[CLLocation alloc] initWithLatitude:lat longitude:lon] locations= @[ MakeLocation(lat1,lon1), MakeLocation(lat2,lon2), MakeLocation(lat3,lon3), MakeLocation(lat4,lon4), MakeLocation(lat5,lon5), MakeLocation(lat6,lon6), MakeLocation(lat7,lon7), MakeLocation(lat8,lon8), MakeLocation(lat9,lon9), MakeLocation(lat10,lon10) ]; for (int l=0; l<[locations count]; l++) { // HERE ITS PERFECT! I CAN SEE ALL 10 ANNOTATIONS! MKPointAnnotation* annotation= [MKPointAnnotation new]; annotation.coordinate = [locations[l] coordinate]; [map addAnnotation: annotation]; } } 

  - (IBAction)parseMethod { [map removeAnnotations:map.annotations]; for (int i=0; i < [arrayID count]; i++) { // arrayID contains ID values to parse for each location NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"http://JSONPARSINGURL/%@",[arrayID objectAtIndex:i]]]; NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5.0]; operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { // PARSING CODE . . . NSMutableArray *value = [JSON objectForKey:@"value"]; NSMutableDictionary *value0 = [value objectAtIndex:0]; [valueID replaceObjectAtIndex:i withObject:[value0 objectForKey:@"valueID"]]; locationIDValue = [[valueID objectAtIndex:i] intValue]; // locationIDValue contains the values that i must use to put different annotations on the map NSLog(@"locationIDValue: %d", locationIDValue); // here I control IF app parses all the values of locationIDValue [table reloadData]; // here I put another control to see all values parsed } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { NSLog(@"FAILURE"); }]; NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // I have used also simple [operation start] but I have same issue! [queue addOperation:operation]; [queue waitUntilAllOperationsAreFinished]; } NSLog(@"END PARSING"); // here I control the end of parsing, so now I can add new annotations to MKMapView according to locationIDValue array MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; for (int l=0; l<[locations count]; l++) { // HERE I CAN SEE ONLY A SINGLE LOCATION! annotation.coordinate = [locations[l] coordinate]; NSLog(@"%f - %f", annotation.coordinate.latitude, annotation.coordinate.longitude); // here I control IF app parses all the values of coordinates [map addAnnotation: annotation]; } } 

 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { MKPinAnnotationView *pinView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"]; pinView.animatesDrop=YES; if (annotation != map.userLocation) { if ( locationIDValue <= 100) { pinView.pinColor = MKPinAnnotationColorRed; return pinView; } pinView.pinColor = MKPinAnnotationColorGreen; return pinView; } else map.userLocation.title = @"My position"; return nil; } 

情况:当我第一次打开应用程序的时候,我可以看到所有的注释掉落在地图上,按照#define MakeLocation的经纬度; 但是如果我按下button并启动parseMethod,我会等待几秒钟(根据NSOperationQueue,但我可以testing它也没有队列,简单的[操作开始]代码),那么我可以看到地图上只有一个单一的注释,总是相同的,在第五个位置奇怪的是,用lat5-lon5坐标(否则,如果我改变了一些代码,我可以看到所有的注释落在同一个位置)。 正如你可以看到我写一些NSLog代码,并添加UITableView来控制活动,这是结果:

 END PARSING coordinates: lat1 - lon1 coordinates: lat2 - lon2 coordinates: lat3 - lon3 coordinates: lat4 - lon4 coordinates: lat5 - lon5 <--- THE STRANGE POSITION coordinates: lat6 - lon6 coordinates: lat7 - lon7 coordinates: lat8 - lon8 coordinates: lat9 - lon9 coordinates: lat10 - lon10 locationIDValue: 100 locationIDValue: 90 locationIDValue: 50 locationIDValue: 120 locationIDValue: 20 locationIDValue: 40 locationIDValue: 80 locationIDValue: 180 locationIDValue: 140 locationIDValue: 10 

那么,看起来PERFECT:appparsing所有的数据(也是一个UITableView填充所有新值parsing的行),所以在parsing操作结束后,我认为我们有必要使用新的注解填充地图。 那么这里有什么问题? 为什么parsing后我只能看到一个注释? 或者,所有的注释掉在相同的位置? 请给我一个帮助!

parseMethod ,改变这个:

 MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; for (int l=0; l<[locations count]; l++) { // HERE I CAN SEE ONLY A SINGLE LOCATION! annotation.coordinate = [locations[l] coordinate]; NSLog(@"%f - %f", annotation.coordinate.latitude, annotation.coordinate.longitude); // here I control IF app parses all the values of coordinates [map addAnnotation: annotation]; } 

对此:

 for (int l=0; l<[locations count]; l++) { // HERE I CAN SEE ONLY A SINGLE LOCATION! //create a NEW annotation for each location... MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]; annotation.coordinate = [locations[l] coordinate]; NSLog(@"%f - %f", annotation.coordinate.latitude, annotation.coordinate.longitude); // here I control IF app parses all the values of coordinates [map addAnnotation: annotation]; } 

MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init]移到for循环中,以便为每个位置创build一个新的注释对象。

现有的代码创build一个注释对象,只是不断修改其坐标。

还有一点非常重要(因为很难发现这个错误,我昨天晚上坐在这个…前面)是检查符合MKAnnotation的对象是否有一些主基类,方法isEqual和/或散列仅基类的数据,你不覆盖你的基类。 这是我的问题,因此isEqual返回YES是所有注释,它总是只显示在地图上的一个注释。 在互联网上我找不到任何关于这个的暗示,所以我会在这里留下至less这样的评论给在相同情况下的穷人。