2013-04-29 1 views
-2

Я пытаюсь создать предложение с адресами автозаполнения с помощью JSON. Проблема, с которой я столкнулась, заключается в том, что я могу получить широту и долготу от пользовательских типов на UISearchDisplay. Однако я пытаюсь разобрать эти данные для имен имен. Я пытался использовать обратное геокодирование от Apple, но без успеха. Я получаю только одно значение. Я использовал геокодирование яблока сразу, но результаты не были тем, чего я ожидал. Вот код:JSON Геокодирование для iOS - разобрать широту/долготу по адресу

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ 

    NSError *error; 

    NSString *lookUpString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&sensor=true", self.searchBar.text]; 

    lookUpString = [lookUpString stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 

    NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookUpString]]; 

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error]; 

    self.locationArray = [[[jsonDict valueForKey:@"results"] valueForKey:@"geometry"] valueForKey:@"location"]; 

    int total = self.locationArray.count; 

    for (int i = 0; i < total - 1; i++) 
    { 
     NSLog(@"locationArray count: %d", self.locationArray.count); 
     NSArray *localLocations; 
     localLocations = [self.locationArray objectAtIndex:i]; 
     NSLog(@"%d",i); 
     NSString *latitudeString = [localLocations valueForKey:@"lat"]; 
     NSString *longitudeString = [localLocations valueForKey:@"lng"]; 

     NSLog(@"LatitudeString:%@ & LongitudeString:%@", latitudeString, longitudeString); 

     NSString *statusString = [jsonDict valueForKey:@"status"]; 

     NSLog(@"JSON Response Status:%@", statusString); 

     double latitude = 0.0; 
     double longitude = 0.0; 

     latitude = [latitudeString doubleValue]; 
     longitude = [longitudeString doubleValue]; 

     CLLocation *location = [[CLLocation alloc] initWithLatitude:latitude longitude:longitude]; 

     [self.geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error){ 
      [[self placemarks] addObject:placemarks]; 
      NSLog(@"PLACEMARKS %d", self.placemarks.count); 

     }]; 

    } 
    NSLog(@"Mutable array %d", self.placemarks.count); 
     [self.searchDisplayController.searchResultsTableView reloadData]; 
    return NO; 
} 

NSLog(@"PLACEMARKS %d", self.placemarks.count); отображать только один раз, в конце задачи. Любые предложения?

ответ

0

Я действительно делал гораздо больше, чем нужно.

Вот мой код прямо сейчас:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{ 

    NSError *error; 

    NSString *lookUpString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=%@&components=country:AU&sensor=false", self.searchBar.text]; 

    lookUpString = [lookUpString stringByReplacingOccurrencesOfString:@" " withString:@"+"]; 

    NSData *jsonResponse = [NSData dataWithContentsOfURL:[NSURL URLWithString:lookUpString]]; 

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonResponse options:kNilOptions error:&error]; 

    self.locationArray = [[jsonDict valueForKey:@"results"] valueForKey:@"geometry"]; 

    int total = self.locationArray.count; 
    NSLog(@"locationArray count: %d", self.locationArray.count); 

    for (int i = 0; i < total; i++) 
    { 
     NSString *statusString = [jsonDict valueForKey:@"status"]; 
     NSLog(@"JSON Response Status:%@", statusString); 

     NSLog(@"Address: %@", [self.locationArray objectAtIndex:i]); 

    } 

    [self.searchDisplayController.searchResultsTableView reloadData]; 
    return NO; 
}