2

我有一个ABAddressBookUITableView. 目前我正在将联系人读取到 中NSDictionary,但是对于某些用户来说这似乎会崩溃,我怀疑这是内存问题。

是否有另一种方法可以ABAddressBook在 a 中显示联系人,UITableView而无需先将它们存储在 anNSDictionary或 using 中ABPeoplePicker

4

3 回答 3

4

使用 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);
于 2012-04-13T12:52:51.300 回答
1

您可以使用以下方式,

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

以上两行将为您在 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在表格视图中使用数组显示它..

于 2011-01-24T11:18:19.320 回答
0

与 Abizern 的答案相同,但如果要显示本地化的全名,请使用ABRecordCopyCompositeName. (英文名是“First Last”,中文名是“LastFirst”)。

ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);
NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);//important for localization
于 2014-08-04T06:10:41.837 回答