Remplir automatiquement la ville et l'état à partir du code postal dans iOS

J'ai trois champs de text à mon avis. 1. Code postal, 2. Ville et 3. État.

Comment remplir automatiquement le champ de ville et d'état du code postal dans iOS?

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSsortingng:(NSSsortingng *)ssortingng { NSSsortingng *currentSsortingng = [textField.text ssortingngByReplacingCharactersInRange:range withSsortingng:ssortingng]; int length = [currentSsortingng length]; if(length > 5) { return NO; } if(length == 5) { [self getCityAndState]; } return YES; } - (void) getCityAndState { //How to use google (or any) api to autofill city and state in objective - c? } 

Utilisez l' Google GeoCoding API pour extraire des informations, si vous souhaitez envoyer un code postal pour recevoir d'autres informations, utilisez ceci:

 NSSsortingng *strRequestParams = [NSSsortingng ssortingngWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=&components=postal_code:%@&sensor=false",zipCode]; strRequestParams = [strRequestParams ssortingngByAddingPercentEscapesUsingEncoding:NSSsortingngEncodingConversionExternalRepresentation]; NSURL *url = [NSURL URLWithSsortingng:strRequestParams]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"GET"]; NSError *error; NSURLResponse *response; NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if (!response) { // "Connection Error", "Failed to Connect to the Internet" } NSSsortingng *respSsortingng = [[NSSsortingng alloc] initWithData:responseData encoding:NSUTF8SsortingngEncoding] ; //NSLog(@"RECEIVED DATA : %@", respSsortingng); 

Si votre variable de code postal est 32000, vous obtiendrez le résultat JSON:

Vous pouvez parsingr ce json pour extraire toutes les informations que vous souhaitez, y compris le pays, la ville, la longitude, la latitude, etc

J'essaie d'éviter les services de Google car ils ont tendance à facturer à un certain niveau d'utilisation. Voici la solution utilisant les frameworks d'Apple:

  #import <CoreLocation/CoreLocation.h> #import <AddressBookUI/AddressBookUI.h> - (void)didEnterZip:(NSSsortingng*)zip { CLGeocoder* geoCoder = [[CLGeocoder alloc] init]; [geoCoder geocodeAddressDictionary:@{(NSSsortingng*)kABPersonAddressZIPKey : zip} completionHandler:^(NSArray *placemarks, NSError *error) { if ([placemarks count] > 0) { CLPlacemark* placemark = [placemarks objectAtIndex:0]; NSSsortingng* city = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressCityKey]; NSSsortingng* state = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressStateKey]; NSSsortingng* country = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressCountryCodeKey]; } else { // Lookup Failed } }]; } 

La réponse d'ar-studios est parfaite puisqu'elle n'introduit pas de dépendance au service de Google.

Cependant, je voudrais également restreindre le code de pays basé sur l'input de l'user ou US-seulement si cela a du sens. Ne pas le restreindre donne des résultats imprévisibles car le géocodeur peut renvoyer plusieurs hits de différents pays.

  #import <CoreLocation/CoreLocation.h> #import <AddressBookUI/AddressBookUI.h> - (void)didEnterZip:(NSSsortingng*)zip { CLGeocoder* geoCoder = [[CLGeocoder alloc] init]; [geoCoder geocodeAddressDictionary:@{(NSSsortingng*)kABPersonAddressZIPKey : zip, (NSSsortingng*)kABPersonAddressCountryCodeKey : @"US"} completionHandler:^(NSArray *placemarks, NSError *error) { if ([placemarks count] > 0) { CLPlacemark* placemark = [placemarks objectAtIndex:0]; NSSsortingng* city = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressCityKey]; NSSsortingng* state = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressStateKey]; NSSsortingng* country = placemark.addressDictionary[(NSSsortingng*)kABPersonAddressCountryCodeKey]; } else { // Lookup Failed } }]; } 

Bien que les réponses de alex_c et d'ar-studios fonctionnent bien, si vous n'avez pas envie de vous AddressBookUI avec AddressBookUI ou les dictionarys, vous pouvez simplement utiliser la geocodeAddressSsortingng:completionHandler: sur le geocoder passant le code postal seul, suffisant pour la search :

 [[CLGeocoder new] geocodeAddressSsortingng:zip completionHandler:^(NSArray *placemarks, NSError *error) { if (placemarks.count) { CLPlacemark *placemark = placemarks.firstObject; NSSsortingng *city = placemark.locality; NSSsortingng *state = placemark.administrativeArea; } }]; 

Voici la version Swift 3 avec toutes les corrections ci-dessus.

 func zipToAddress(zip: Ssortingng, onSuccess: @escaping (Ssortingng, Ssortingng, Ssortingng) -> Void, onFail: @escaping () -> Void) { let geoCoder = CLGeocoder(); let params = [ Ssortingng(CNPostalAddressPostalCodeKey): zip, Ssortingng(CNPostalAddressISOCountryCodeKey): "US", ] geoCoder.geocodeAddressDictionary(params) { (plasemarks, error) -> Void in if let plases = plasemarks { if plases.count > 0 { let firstPlace = plases[0] print( "City \(firstPlace.locality) state \(firstPlace.administrativeArea) and country \(firstPlace.country) and iso country \(firstPlace.country)") let city = firstPlace.locality let state = firstPlace.administrativeArea let country = firstPlace.country onSuccess(city != nil ? city! : "", state != nil ? state! : "", country ?? "Not found") return; } } onFail() } } 
 static func zipToAddress(zip: Ssortingng, onSuccess: (Ssortingng, Ssortingng) -> Void, onFail: () -> Void) { var geoCoder = CLGeocoder(); var params = [ Ssortingng(kABPersonAddressZIPKey): zip, Ssortingng(kABPersonAddressCountryCodeKey): "US", ] geoCoder.geocodeAddressDictionary(params) { (plasemarks, error) -> Void in var plases = plasemarks as? Array<CLPlacemark> if plases != nil && plases?.count > 0 { var firstPlace = plases?[0] var city = firstPlace?.addressDictionary[Ssortingng(kABPersonAddressCityKey)] as? Ssortingng var state = firstPlace?.addressDictionary[Ssortingng(kABPersonAddressStateKey)] as? Ssortingng var country = firstPlace?.addressDictionary[Ssortingng(kABPersonAddressCountryKey)] as? Ssortingng // US onSuccess(city != nil ? city! : "", state != nil ? state! : "") return; } onFail() } } 

même avec swift, je ne peux pas append ceci comme commentaire (les points ne sont pas enoght)