16

CLGeocoder から取得した AddressDictionary からフォーマットされたアドレスを取得しようとしています。結果なしで次のコードを使用しました:

subtitle = [NSString stringWithString:[[addressDict objectForKey:@"FormattedAddressLines"]objectAtIndex:0]];

また試しました:

subtitle = [[[ABAddressBook sharedAddressBook] formattedAddressFromDictionary:placemark.addressDictionary] string];

しかし、このコードは Mac OS X でのみ動作するようです。

Compiler は ABAdressBook について質問しますが、両方のヘッダー ファイルをインポートしています。

#import <AddressBook/ABAddressBook.h>
#import <AddressBook/AddressBook.h>
4

10 に答える 10

40

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

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

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

subtitle = 
    ABCreateStringWithAddressDictionary(placemark.addressDictionary, NO);
于 2011-10-21T12:16:44.917 に答える
24

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

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

于 2013-08-11T21:12:04.517 に答える
19

Martyn DavisABCreateStringWithAddressDictionaryが強調しているように、iOS 9 では非推奨です。

フレームワークをインポートする限り、以下の関数を使用しaddressDictionaryて を新しいに変換し、CNMutablePostalAddressを使用してローカライズされた文字列を生成できます。CNPostalAddressFormatterContacts

スウィフト 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)
}

スウィフト 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)
}
于 2015-12-18T13:22:08.250 に答える
4

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
}
于 2016-10-04T21:12:26.990 に答える
1

これは次のように簡単です

func updateUserAddress(coordinates: CLLocationCoordinate2D) {
    let geoCoder = CLGeocoder()
    let location = CLLocation(latitude: coordinates.latitude, longitude: coordinates.longitude)
    geoCoder.reverseGeocodeLocation(location) {[weak self] (placemarks, error) in
        if error == nil, let placemark = placemarks?.first, let address = placemark.postalAddress {
            self?.userLocationLabel.text = CNPostalAddressFormatter.string(from: address, style: .mailingAddress)
        }
    }
}
于 2020-07-17T08:13:12.193 に答える