在JSON解析之后-viewForAnnotation在MKMapView上只显示一个单独的注释 [英] After JSON parsing -viewForAnnotation shows only ONE single annotation on MKMapView

查看:86
本文介绍了在JSON解析之后-viewForAnnotation在MKMapView上只显示一个单独的注释的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need to show on my MkMapView about 10 locations (and respective annotations) and after pressing a button I need to add new different annotations according to different JSON parsing results (for example a locationIDValue < 100 means a red pin, otherwise green). This is the simplified code:

- (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纬度和经度;但是如果我按下按钮并启动parseMethod,我会等待几秒钟(根据NSOperationQueue,但是我也可以在没有队列的情况下测试它,只需要简单的[操作开始]代码),然后我就能看到地图上只有一个单一的注释,总是一样的,奇怪的是在第五个位置,使用lat5-lon5坐标(否则,如果我改变一些代码,我可以看到所有的注释都落在相同的位置)。你可以看到我写了一些NSLog代码并添加UITableView来控制活动,这就是结果:

The situation: When I open app for the first time its all right, I can see ALL the annotations dropping on the map, according with the #define MakeLocation latitude and longitude; but if I press the button and start the parseMethod, I wait a few seconds (according to NSOperationQueue, but I can test it also without queue, with simple [operation start] code), then I can see ONLY ONE SINGLE annotation on the map, always the same, strangely on the FIFTH location, with lat5-lon5 coordinates (otherwise, if I change a few code I can see ALL THE ANNOTATIONS dropping on the SAME location). As u can see I write some NSLog code and add UITableView to control the activity, and this is the result:

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

好吧,似乎完美:应用程序解析所有数据(也是UITableView使用解析的所有新值填充行),因此在解析操作结束后,我认为我们拥有使用新注释填充地图所需的每个值。那么,这里有什么问题?解析后为什么我只能看到一个注释?或者,所有注释都在同一位置下降?请给我一个帮助!

Well, it seems PERFECT: app parse all the data (also a UITableView populate rows with ALL the new values parsed), so AFTER the end of parsing operation I think we have EVERY value necessary to populate map with new annotations. Well, what is wrong here? Why after parsing I can only see a single annotation? Or, ALL annotations dropping ON THE SAME LOCATION? Please give me an help!

推荐答案

parseMethod 中,更改以下内容:

In parseMethod, change this:

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-loop,以便为每个位置创建一个新的注释对象。

Move the MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init] to inside the for-loop so that a new annotation object is created for each location.

那里的现有代码创建了一个注释对象,并且只是不断修改它的坐标。

The existing code there creates a single annotation object and just keeps modifying its coordinate.

这篇关于在JSON解析之后-viewForAnnotation在MKMapView上只显示一个单独的注释的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆