如何从AddressDictionary获取格式化的地址NSString?
尝试从AddressGeneration获得格式化的地址,我从CLGeocoder获得。 使用下面的代码没有结果:
subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]];
还试过:
subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string];
但是这个代码似乎只适用于Mac OS X。
编译器询问有关ABAdressBook,但我有两个头文件导入。
#import <AddressBook/ABAddressBook.h> #import <AddressBook/AddressBook.h>
addressDictionary
属性的文档说:
您可以格式化此字典的内容以获取完整的地址string,而不是自己创build地址。 要格式化字典,请使用“地址簿UI函数参考”中所述的ABCreateStringWithAddressDictionary函数。
因此,添加和导入AddressBookUI
框架,并尝试:
subtitle = ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);
在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); }];
我还找不到有关这方面的文档,但它适用于我testing的所有地址。
正如Martyn Davis强调的, ABCreateStringWithAddressDictionary
在iOS 9中已被弃用。
您可以使用下面的函数将addressDictionary
转换为新的CNMutablePostalAddress
,然后使用CNPostalAddressFormatter
生成一个本地化的string,只要您导入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) }
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) }
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) } }) } }
以上是迅捷版本。
我正在使用Swift 3 / XCode 8
ZYiOS的回答很好,但是没有为我编译。
该问题询问如何从现有的地址字典获取string地址。 这就是我所做的:
import CoreLocation func getAddressString(placemark: CLPlacemark) -> String? { var originAddress : String? if let addrList = placemark.addressDictionary?["FormattedAddressLines"] as? [String] { originAddress = addrList.joined(separator: ", ") } return originAddress }
Swift 3 / Xcode 8 Helper Mehtod从CLPlaceMark获取地址
class func formattedAddress(fromPlacemark placemark: CLPlacemark) -> String{ var address = "" if let name = placemark.addressDictionary?["Name"] as? String { address = constructAddressString(address, newString: name) } if let city = placemark.addressDictionary?["City"] as? String { address = constructAddressString(address, newString: city) } if let state = placemark.addressDictionary?["State"] as? String { address = constructAddressString(address, newString: state) } if let country = placemark.country{ address = constructAddressString(address, newString: country) } return address }
简单地创buildCLLocation
扩展:
typealias AddressDictionaryHandler = ([String: Any]?) -> Void extension CLLocation { func addressDictionary(completion: @escaping AddressDictionaryHandler) { CLGeocoder().reverseGeocodeLocation(self) { placemarks, _ in completion(placemarks?.first?.addressDictionary as? [String: AnyObject]) } } }
例:
let location = CLLocation() location.addressDictionary { dictionary in let city = dictionary?["City"] as? String let street = dictionary?["Street"] as? String }