CLGeocoderから取得したAddressDictionaryからフォーマットされたアドレスを取得しようとしています。次のコードを使用しても結果はありません。
subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]];
また試した:
subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string];
しかし、このコードはMac OSXでのみ機能しているようです。
コンパイラがABAdressBookについて質問しますが、両方のヘッダーファイルをインポートしています。
#import <AddressBook/ABAddressBook.h>
#import <AddressBook/AddressBook.h>
addressDictionary
プロパティのドキュメントには次のように書かれています。
自分でアドレスを作成するのではなく、この辞書の内容をフォーマットして、完全なアドレス文字列を取得できます。ディクショナリをフォーマットするには、アドレス帳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);
}];
これに関するドキュメントはまだ見つかりませんでしたが、テストしたすべてのアドレスで機能します。
Martyn Davisが強調しているように、iOS9ではABCreateStringWithAddressDictionary
は非推奨です。
以下の関数を使用してaddressDictionary
を新しいCNMutablePostalAddress
に変換し、CNPostalAddressFormatter
をインポートする限り、Contacts
を使用してローカライズされた文字列を生成できます。 _ フレームワーク。
// 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)
}
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バージョンです。
私はSwift 3/XCode 8を使用しています
ZYiOSの答え 素晴らしくて短いですが、私のためにコンパイルされませんでした。
質問は、既存のアドレスディクショナリから文字列アドレスに取得する方法を尋ねます。これは私がしたことです:
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 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
}
CLLocation
の拡張子を作成するだけです。
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
}
Swift 5バージョン
CLGeocoder().reverseGeocodeLocation(newLocation!, preferredLocale: nil) { (clPlacemark: [CLPlacemark]?, error: Error?) in
guard let place = clPlacemark?.first else {
print("No placemark from Apple: \(String(describing: error))")
return
}
if let addrList = place.addressDictionary?["FormattedAddressLines"] as? [String] {
let addressString = addrList.joined(separator: ", ")
print(addressString)
}
}