ABAddressBook хранит значения в NSDictionary - PullRequest
2 голосов
/ 24 января 2011

У меня есть приложение, которое отображает ABAddressBook контакты в UITableView.В настоящее время я читаю контакты в NSDictionary, однако для некоторых пользователей это приводит к сбою, который, как я подозреваю, является проблемой с памятью.

Есть ли другой способ отображения ABAddressBook контактов в * 1007?* без предварительного сохранения их в NSDictionary или использования ABPeoplePicker?

Ответы [ 3 ]

4 голосов
/ 13 апреля 2012

Другой способ с использованием ARC:

ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef addressBookData = ABAddressBookCopyArrayOfAllPeople(addressBook);

CFIndex count = CFArrayGetCount(addressBookData);

NSMutableArray *contactsArray = [NSMutableArray new];

for (CFIndex idx = 0; idx < count; idx++) {
    ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);

    NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

    if (firstName) {
        NSDictionary *dict = [NSDictionary dictionaryWithObject:firstName ForKey:@"name"];
        [contactsArray addObject:dict];
    }

}
CFRelease(addressBook);
CFRelease(addressBookData);
1 голос
/ 24 января 2011

Вы можете использовать следующий способ,

ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL);
NSArray *arrTemp = (NSArray *)ABAddressBookCopyArrayOfAllPeople(ab);

Приведенные выше 2 строки создадут массив для всех ваших контактов на iPhone.

Теперь любое свойство контакта, которое вы хотите отобразитьВы можете отобразить с помощью приведенного ниже кода.Например, я хочу отобразить имя всех контактов, а затем создать один изменяемый массив с именем arrContact.

NSMutableArray *arrContact = [[NSMutableArray alloc] init];
for (int i = 0; i < [arrTemp count]; i++) 
{
    NSMutableDictionary *dicContact = [[NSMutableDictionary alloc] init];
    NSString *str = (NSString *) ABRecordCopyValue([arrTemp objectAtIndex:i], kABPersonFirstNameProperty);
    @try 
    {
        [dicContact setObject:str forKey:@"name"];
    }
    @catch (NSException * e) {
        [dicContact release];
        continue;
    }
    [arrContact addObject:dicContact];
    [dicContact release];
}

. Теперь просто отобразите его, используя массив arrContact в табличном представлении.

0 голосов
/ 04 августа 2014

То же, что и ответ Abizern, но если вы хотите отобразить полные имена, которые локализованы, используйте ABRecordCopyCompositeName. (В английском языке имена «First Last», но в китайских названиях «LastFirst»).

ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);
NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);//important for localization
...