web-dev-qa-db-ja.com

AddressDictionaryからフォーマットされたアドレスNSStringを取得する方法は?

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>
16
Shmidt

addressDictionaryプロパティのドキュメントには次のように書かれています。

自分でアドレスを作成するのではなく、この辞書の内容をフォーマットして、完全なアドレス文字列を取得できます。ディクショナリをフォーマットするには、アドレス帳UI関数リファレンスの説明に従ってABCreateStringWithAddressDictionary関数を使用します。

したがって、AddressBookUIフレームワークを追加してインポートし、次のことを試してください。

subtitle = 
    ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);
40
user467105

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

これに関するドキュメントはまだ見つかりませんでしたが、テストしたすべてのアドレスで機能します。

24
Klaas

Martyn Davisが強調しているように、iOS9ではABCreateStringWithAddressDictionaryは非推奨です。

以下の関数を使用して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)
}

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)
}
19
tebs1200
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バージョンです。

13
ZYiOS

私は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
}
4
Nick Graham

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
  }
2
Sourabh Sharma

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)

            }
        }
0
mini coder