2014-04-30 30 views
8

Görünümümde üç textfields var. 1. Posta kodu, 2. Şehir ve 3. Devlet.iOS'ta posta kodunu şehir ve eyaleti otomatik doldurma

iOS'ta posta kodunu şehir ve eyalet alanı nasıl doldurulur? Başka bilgi alma posta kodu göndermek istiyorsanız

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString *currentString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
    int length = [currentString 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? 
} 
+0

Kullanım goolge Geocoding API - [Bu bakın] (https://developers.google.com/maps/documentation/geocoding/?csw=1) – Shruti

+0

Kontrol bu bağlantıyı http://stackoverflow.com/questions/4749706/lookup-city-and-state-by-zip-google-geocode-api – user2071152

cevap

10

, Bilgi ayıklamak için Google GeoCoding API kullanın, bunu kullanın:

NSString *strRequestParams = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/geocode/json?address=&components=postal_code:%@&sensor=false",zipCode]; 

strRequestParams = [strRequestParams stringByAddingPercentEscapesUsingEncoding:NSStringEncodingConversionExternalRepresentation]; 

NSURL *url = [NSURL URLWithString: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" 
} 

NSString *respString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ; 
//NSLog(@"RECEIVED DATA : %@", respString); 

sizin posta kodu değişken 32000 ise, this JSON sonuç elde edecek :

sen Ülke, Şehir, boylam, enlem vb

+2

@Khanwar Ali: Sadece cevabı henüz kabul etmemiş olmanızın sebebi de olsa MustChangeCharactersInRange: (NSRange) menzil yöntemi zip alanından 4 charachters alıyor metin alanından 5 yerine. Nasıl? –

16

ben dahil istediğiniz herhangi bir bilgi ayıklamak için bu json ayrıştırmak Google'ın hizmetlerinden kaçınmaya çalışın çünkü belirli bir kullanım düzeyinde ücret alma eğilimi gösterirler. İşte Apple'ın çerçeveler kullanarak çözüm:

#import <CoreLocation/CoreLocation.h> 
#import <AddressBookUI/AddressBookUI.h> 

- (void)didEnterZip:(NSString*)zip 
{ 
    CLGeocoder* geoCoder = [[CLGeocoder alloc] init]; 
    [geoCoder geocodeAddressDictionary:@{(NSString*)kABPersonAddressZIPKey : zip} 
     completionHandler:^(NSArray *placemarks, NSError *error) { 
     if ([placemarks count] > 0) { 
      CLPlacemark* placemark = [placemarks objectAtIndex:0]; 

      NSString* city = placemark.addressDictionary[(NSString*)kABPersonAddressCityKey]; 
      NSString* state = placemark.addressDictionary[(NSString*)kABPersonAddressStateKey]; 
      NSString* country = placemark.addressDictionary[(NSString*)kABPersonAddressCountryCodeKey]; 

     } else { 
      // Lookup Failed 
     } 
    }]; 
} 
4

a-r-stüdyoları tarafından cevap Google'ın hizmeti bir bağımlılık tanıtmak olmadığından, nokta. Bununla birlikte, ülke kodunu, kullanıcının girdisine veya ABD'ye göre anlamlandırırsa, aynı zamanda da mantıklı olduğunda kısıtlayacağım. Kısıtlama, öngörülemeyen sonuçlar verir çünkü coğrafi kodlayıcı farklı ülkelerden birden fazla isabet alabilir. Eğer AddressBookUI ya sözlükleri ile mızmızlanıyor gibi hissetmiyorum eğer

#import <CoreLocation/CoreLocation.h> 
#import <AddressBookUI/AddressBookUI.h> 

- (void)didEnterZip:(NSString*)zip 
{ 
    CLGeocoder* geoCoder = [[CLGeocoder alloc] init]; 
    [geoCoder geocodeAddressDictionary:@{(NSString*)kABPersonAddressZIPKey : zip, 
      (NSString*)kABPersonAddressCountryCodeKey : @"US"} 
     completionHandler:^(NSArray *placemarks, NSError *error) { 
     if ([placemarks count] > 0) { 
      CLPlacemark* placemark = [placemarks objectAtIndex:0]; 

      NSString* city = placemark.addressDictionary[(NSString*)kABPersonAddressCityKey]; 
      NSString* state = placemark.addressDictionary[(NSString*)kABPersonAddressStateKey]; 
      NSString* country = placemark.addressDictionary[(NSString*)kABPersonAddressCountryCodeKey]; 

     } else { 
      // Lookup Failed 
     } 
    }]; 
} 
3

alex_c ve ar-stüdyolardan cevaplar, iyi çalışırken, sadece tek başına posta kodu geçen geocoder üzerinde geocodeAddressString:completionHandler: yöntemi kullanabilirsiniz Swift olarak

[[CLGeocoder new] geocodeAddressString:zip completionHandler:^(NSArray *placemarks, NSError *error) { 
    if (placemarks.count) { 
     CLPlacemark *placemark = placemarks.firstObject; 

     NSString *city = placemark.locality; 
     NSString *state = placemark.administrativeArea; 
    } 
}]; 

:

CLGeocoder().geocodeAddressString(zip) { (placemarks, error) in 
    if let result = placemarks?.first { 
     let city = result.locality 
     let state = result.administrativeArea 
    } 
} 
0
static func zipToAddress(zip: String, onSuccess: (String, String) -> Void, onFail:() -> Void) { 
    var geoCoder = CLGeocoder(); 

    var params = [ 
      String(kABPersonAddressZIPKey): zip, 
      String(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[String(kABPersonAddressCityKey)] as? String 
      var state = firstPlace?.addressDictionary[String(kABPersonAddressStateKey)] as? String 
      var country = firstPlace?.addressDictionary[String(kABPersonAddressCountryKey)] as? String // US 

      onSuccess(city != nil ? city! : "", state != nil ? state! : "") 
      return; 
     } 

     onFail() 
    } 
} 
arama için yeterli

ile aynı çabuk, yorum olarak ekleyemiyorum (nokta belirtilmemiş)

3

Tüm yukarıda düzeltmeleri olan Swift 3 sürümü.

func zipToAddress(zip: String, onSuccess: @escaping (String, String, String) -> Void, onFail: @escaping() -> Void) { 
    let geoCoder = CLGeocoder(); 

    let params = [ 
     String(CNPostalAddressPostalCodeKey): zip, 
     String(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() 
    } 
} 
0

İşte Swift 4 sürümü, uygun bir isteğe bağlı olarak bonus olarak işleniyor. Sorgulanan posta kodunun ülkesini manuel olarak belirlemek istiyorsanız bunu kullanın.

private func zipToAddress(zip: String?, onSuccess: @escaping (String, String) -> Void, onFail: ((Error?) -> Void)?) { 

    guard let zip = zip else { 
     onFail?(nil) 
     return 
    } 

    let geoCoder = CLGeocoder() 

    let params: [String: Any] = [ 
     String(CNPostalAddressPostalCodeKey): zip, 
     String(CNPostalAddressISOCountryCodeKey): "US" 
     ] 

    geoCoder.geocodeAddressDictionary(params) { placemarks, error -> Void in 
     /// Read CLPlacemark documentation to see all available fields 
     if let place = placemarks?[0], let city = place.locality, let state = place.administrativeArea { 
      onSuccess(city, state) 
     } else { 
      onFail?(error) 
     } 
    } 
} 

İşte çözüm Nathan'ın cevabına dayanıyor. Kullanıcı yerel ayarlarına göre şehir ve yönetim alanını sorgulamak için bunu kullanın.

private func localZipToAddress(zip: String?, onSuccess: @escaping (String, String) -> Void, onFail: ((Error?) -> Void)?) { 

    guard let zip = zip else { 
     onFail?(nil) 
     return 
    } 

    CLGeocoder().geocodeAddressString(zip) { placemarks, error in 
     if let result = placemarks?.first, let city = result.locality, let state = result.administrativeArea { 
      onSuccess(city, state) 
     } else { 
      onFail?(error) 
     } 
    } 
} 
İlgili konular