4 votes

Comment obtenir l'adresse de la rue à partir d'ABPeoplePickerNavigationController

J'ai besoin de l'adresse postale d'un contact. Je sais comment obtenir les propriétés de valeur unique, mais l'adresse postale est une propriété à valeurs multiples. La documentation d'Apple montre comment la définir, mais pas comment la récupérer. Quelqu'un peut-il m'aider?

PS : ceci ne fonctionne pas :

ABRecordCopyValue(person, kABPersonAddressStreetKey);

9voto

user1007895 Points 829

Je viens de comprendre :

ABMultiValueRef st = ABRecordCopyValue(person, kABPersonAddressProperty);
if (ABMultiValueGetCount(st) > 0) {
    CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(st, 0);
    self.street.text = CFDictionaryGetValue(dict, kABPersonAddressStreetKey);
}

3voto

CryingHippo Points 3770

Version Swift :

    if let addresses : ABMultiValueRef = ABRecordCopyValue(person, kABPersonAddressProperty)?.takeRetainedValue() as ABMultiValueRef? where ABMultiValueGetCount(addresses) > 0 {
        for index in 0..

`Vous pouvez accéder à chaque champ de l'adresse en fournissant la clé correspondante :

let street  = address[kABPersonAddressStreetKey as String]
let city    = address[kABPersonAddressCityKey as String]
let state   = address[kABPersonAddressStateKey as String]
let zip     = address[kABPersonAddressZIPKey as String]
let country = address[kABPersonAddressCountryKey as String]
let code    = address[kABPersonAddressCountryCodeKey as String]`

2voto

KiranJasvanee Points 11

Swift 3.0

//Extraire l'adresse de facturation du format ABRecord et l'assigner en conséquence
let addressProperty: ABMultiValue = ABRecordCopyValue(billingAddress, kABPersonAddressProperty).takeUnretainedValue() as ABMultiValue

if let dict: NSDictionary = ABMultiValueCopyValueAtIndex(addressProperty, 0).takeUnretainedValue() as? NSDictionary {
     print(dict[String(kABPersonAddressStreetKey)] as? String)
     print(dict[String(kABPersonAddressCityKey)] as? String)
     print(dict[String(kABPersonAddressStateKey)] as? String)
     print(dict[String(kABPersonAddressZIPKey)] as? String)
     print(dict[String(kABPersonAddressCountryKey)] as? String) //"États-Unis"
}

1voto

chrisco Points 451

Si l'utilisateur a plusieurs adresses définies - travail, domicile, etc., vous devrez utiliser l'attribut d'identifiant pour les distinguer. Ce que j'ai trouvé, tiré de messages similaires sur les adresses e-mail, est :

#pragma mark - ABPeoplePickerNavigationControllerDelegate

- (IBAction)chooseContact:(id)sender
{
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    [self presentViewController:picker animated:YES completion:nil];
//    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void) peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier
{
    if (property == kABPersonAddressProperty)
    {
        ABMultiValueRef addresses = ABRecordCopyValue(person, property);
        CFIndex addressIndex = ABMultiValueGetIndexForIdentifier(addresses, identifier);
        CFDictionaryRef address = ABMultiValueCopyValueAtIndex(addresses, addressIndex);

        // créer une chaîne d'adresse à rechercher
        NSString *street = (NSString*) CFDictionaryGetValue(address, kABPersonAddressStreetKey);
        NSString *city = (NSString*) CFDictionaryGetValue(address, kABPersonAddressCityKey);
        NSString *state = (NSString*) CFDictionaryGetValue(address, kABPersonAddressStateKey);
        NSString *postal = (NSString*) CFDictionaryGetValue(address, kABPersonAddressZIPKey);
        NSString *country = (NSString*) CFDictionaryGetValue(address, kABPersonAddressCountryKey);

        CFRelease(address);
        CFRelease(addresses);
        [self dismissViewControllerAnimated:YES completion:nil];
        return NO;
    }

    return YES;
}

.

0voto

Ole Begemann Points 85798

Je suppose que cela devrait fonctionner ainsi (dérivé de la documentation, non testé) :

ABMultiValueRef addressMultiValue = ABRecordCopyValue(person, kABPersonAddressProperty);
CFArrayRef allAddresses = ABMultiValueCopyArrayOfAllValues(addressMultiValue);
CFDictionaryRef firstAddress = CFArrayGetValueAtIndex(allAddresses, 0);
CFStringRef street = CFDictionaryGetValue(firstAddress, kABPersonAddressStreetKey);
NSLog(@"%@", (__bridge NSString *)street);
CFRelease(allAddresses);
CFRelease(addressMultiValue);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X