如何从AddressDictionary获取格式化地址NSString?

Shm*_*idt 15 addressbook ios clgeocoder

试图从AddressDictionary获取格式化地址,这是我从CLGeocoder获得的.使用以下代码,没有结果:

subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

还尝试过:

subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string];
Run Code Online (Sandbox Code Playgroud)

但是这段代码似乎只适用于Mac OS X.

编译器询问ABAdressBook,但我导入了两个头文件.

#import <AddressBook/ABAddressBook.h>
#import <AddressBook/AddressBook.h>
Run Code Online (Sandbox Code Playgroud)

小智 40

addressDictionary物业的文件说:

您可以格式化此字典的内容以获取完整的地址字符串,而不是自己构建地址.要格式化字典,请使用"地址簿UI函数参考"中所述的ABCreateStringWithAddressDictionary函数.

所以添加并导入AddressBookUI框架并尝试:

subtitle = 
    ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);
Run Code Online (Sandbox Code Playgroud)

  • fyi - ABCreateStringWithAddressDictionary已在iOS 9.0中弃用 (12认同)
  • 这是正确的使用方法......但它并不总是提供完整的地址.例如,使用CLGeocoder查找"wall street"将返回一个地标,并在地标字典上调用ABCreateStringWithAddressDictionary将返回"New York,NY,United Stated"......并且"华尔街"无处可寻. (2认同)
  • ```addressDictionary``` 在 iOS 11 中已弃用。 (2认同)

Kla*_*aas 25

在iOS 6.1下进行一些挖掘后,我发现CLPlacemark地址字典包含一个预先格式化的地址:

CLLocation *location = [[CLLocation alloc]initWithLatitude:37.3175 longitude:-122.041944];
[[[CLGeocoder alloc]init] reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
    CLPlacemark *placemark = placemarks[0];
    NSArray *lines = placemark.addressDictionary[ @"FormattedAddressLines"];
    NSString *addressString = [lines componentsJoinedByString:@"\n"];
    NSLog(@"Address: %@", addressString);
}];
Run Code Online (Sandbox Code Playgroud)

我还没有找到关于此的文档,但它适用于我测试的所有地址.


teb*_*200 19

正如Martyn Davis强调的那样,ABCreateStringWithAddressDictionary在iOS 9中被弃用了.

您可以使用以下函数将其转换addressDictionary为较新的函数CNMutablePostalAddress,然后使用该函数CNPostalAddressFormatter生成本地化字符串,只要您导入Contacts框架即可.

Swift 3.x

// Convert to the newer CNPostalAddress
func postalAddressFromAddressDictionary(_ addressdictionary: Dictionary<NSObject,AnyObject>) -> CNMutablePostalAddress {
   let address = CNMutablePostalAddress()

   address.street = addressdictionary["Street" as NSObject] as? String ?? ""
   address.state = addressdictionary["State" as NSObject] as? String ?? ""
   address.city = addressdictionary["City" as NSObject] as? String ?? ""
   address.country = addressdictionary["Country" as NSObject] as? String ?? ""
   address.postalCode = addressdictionary["ZIP" as NSObject] as? String ?? ""

   return address
}

// Create a localized address string from an Address Dictionary
func localizedStringForAddressDictionary(addressDictionary: Dictionary<NSObject,AnyObject>) -> String {
    return CNPostalAddressFormatter.string(from: postalAddressFromAddressDictionary(addressDictionary), style: .mailingAddress)
}
Run Code Online (Sandbox Code Playgroud)

Swift 2.x

import Contacts

// Convert to the newer CNPostalAddress
func postalAddressFromAddressDictionary(addressdictionary: Dictionary<NSObject,AnyObject>) -> CNMutablePostalAddress {

    let address = CNMutablePostalAddress()

    address.street = addressdictionary["Street"] as? String ?? ""
    address.state = addressdictionary["State"] as? String ?? ""
    address.city = addressdictionary["City"] as? String ?? ""
    address.country = addressdictionary["Country"] as? String ?? ""
    address.postalCode = addressdictionary["ZIP"] as? String ?? ""

    return address
}

// Create a localized address string from an Address Dictionary
func localizedStringForAddressDictionary(addressDictionary: Dictionary<NSObject,AnyObject>) -> String {

    return CNPostalAddressFormatter.stringFromPostalAddress(postalAddressFromAddressDictionary(addressDictionary), style: .MailingAddress)
}
Run Code Online (Sandbox Code Playgroud)


ZYi*_*iOS 12

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    // get the address
    if let location = locations.last {
        CLGeocoder().reverseGeocodeLocation(location, completionHandler: { (result: [CLPlacemark]?, err: NSError?) -> Void in
            if let placemark = result?.last
                , addrList = placemark.addressDictionary?["FormattedAddressLines"] as? [String]
            {
                let address =  addrList.joinWithSeparator(", ")
                print(address)
            }
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

以上是快速版本.