Как вытащить поле Страна из ABAddressBookRef? - PullRequest
4 голосов
/ 27 июня 2011

У меня проблемы с пониманием того, как получить доступ к свойствам адреса в ABAddressBookRef. Я сделал это хорошо с телефонными номерами:

ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(person, kABPersonPhoneProperty);
NSArray* phoneNumbers = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty);
CFRelease(phoneNumberProperty);

Но, увы ... Я не могу понять, как это сделать для адресов. Если я сделаю это:

ABMultiValueRef addressProperty = ABRecordCopyValue(person, kABPersonAddressProperty);
NSArray *address = (NSArray *)ABMultiValueCopyArrayOfAllValues(addressProperty);

Я получаю обратно словарь, но он напечатан как массив. Как я могу получить доступ к свойствам в нем? Я видел множество различных предложений в Интернете, но все они, кажется, содержат около 30 строк кода, просто чтобы извлечь одну строку из словаря!

Может кто-нибудь помочь, пожалуйста? Спасибо!

1 Ответ

11 голосов
/ 27 июня 2011

Для адресов вы получаете массив словарей, поэтому вы просматриваете массив и извлекаете нужное значение ключа из каждого словаря:

ABMultiValueRef addressProperty = ABRecordCopyValue(person, kABPersonAddressProperty);
NSArray *address = (NSArray *)ABMultiValueCopyArrayOfAllValues(addressProperty);
for (NSDictionary *addressDict in address) 
{
    NSString *country = [addressDict objectForKey:@"Country"];
}
CFRelease(addressProperty);

Вы также можете выполнить цикл непосредственно через ABMultiValueRef вместо того, чтобы сначала преобразовать его в NSArray:

ABMultiValueRef addressProperty = ABRecordCopyValue(person, kABPersonAddressProperty);

for (CFIndex i = 0; i < ABMultiValueGetCount(addressProperty); i++) 
{
    CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(addressProperty, i);
    NSString *country = (NSString *)CFDictionaryGetValue(dict, kABPersonAddressCountryKey);
    CFRelease(dict);
}

CFRelease(addressProperty);
...