2014-04-30 5 views
8

मेरे पास मेरे दृश्य में तीन टेक्स्टफील्ड हैं। 1. ज़िप कोड, 2. शहर और 3. राज्य।आईओएस में ज़िप कोड से ऑटोफिल शहर और राज्य

आईओएस में ज़िप कोड से शहर और राज्य क्षेत्र को ऑटोफिल कैसे करें?

- (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

उपयोग Goolge जियोकोडिंग API - [यह देखें] (https://developers.google.com/maps/documentation/geocoding/?csw=1) – Shruti

+0

चेक इस लिंक http://stackoverflow.com/questions/4749706/लुकअप-सिटी-एंड-स्टेट-बाय-ज़िप-google-geocode-api – user2071152

उत्तर

10

Google GeoCoding API का प्रयोग करें सूचना निकालने के लिए, यदि आप अन्य जानकारी प्राप्त करने के जिप कोड भेजना चाहते हैं, इस का उपयोग करें:

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); 

तो अपना ज़िपकोड चर 32000 है, तो आप this JSON परिणाम मिल जाएगा :

आप सहित चाहते हैं देश, शहर, देशांतर, अक्षांश आदि

+2

@ खानवार अली: केवल कारण है कि आपने अपना जवाब स्वीकार नहीं किया है, अभी तक होना चाहिए चेंज कैरेक्टर इनरेंज: (एनएसआरेंज) रेंज विधि ज़िप क्षेत्र से 4 charachters उठा रहा है टेक्स्ट फ़ील्ड से 5 के बजाय। कैसे? –

16

मैं किसी भी जानकारी निकालने के लिए इस json पार्स कर सकते हैं Google की सेवाओं से बचने का प्रयास करें क्योंकि वे उपयोग के एक निश्चित स्तर पर चार्ज करते हैं। यहाँ एप्पल के चौखटे का उपयोग कर समाधान है:

#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

एक-R-स्टूडियो द्वारा जवाब स्थान पर है, क्योंकि यह गूगल की सेवा पर एक निर्भरता की स्थिति नहीं है।

हालांकि, मैं देश के इनपुट या यूएस-केवल आधार पर देश कोड को भी सीमित कर दूंगा, अगर यह समझ में आता है। इसे प्रतिबंधित नहीं करने से अप्रत्याशित परिणाम मिलते हैं क्योंकि भूगर्भक विभिन्न देशों से कई हिट वापस कर सकता है।

#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 और अर-स्टूडियो से जवाब, अच्छी तरह से काम करते समय यदि आप AddressBookUI या शब्दकोशों के साथ गड़बड़ की तरह नहीं लग रहा है, तो आप बस अकेले जिप कोड है, जिसमें गुजर geocoder पर geocodeAddressString:completionHandler: विधि का उपयोग कर सकते हैं

[[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() 
    } 
} 
देखने के लिए पर्याप्त

स्विफ्ट के साथ ही, मैं इसे टिप्पणी के रूप में नहीं जोड़ सकता (अंक नहीं है)

3

सभी उपरोक्त सुधारों के साथ स्विफ्ट 3 संस्करण यहां है।

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

यहां स्विफ्ट 4 संस्करण है, जिसमें उचित विकल्प हैं जो बोनस के रूप में हैंडलिंग करते हैं। यदि आप क्वेरी किए गए ज़िप कोड का मैन्युअल रूप से देश निर्दिष्ट करना चाहते हैं तो इसका उपयोग करें।

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) 
     } 
    } 
} 

और यहां नाथन के उत्तर पर आधारित समाधान है। उपयोगकर्ता लोकेल के आधार पर शहर और प्रशासनिक क्षेत्र के लिए पूछताछ के लिए इसका उपयोग करें।

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) 
     } 
    } 
} 
संबंधित मुद्दे