我有一个在UITableView中显示ABAddressBook联系人的应用程序。目前我正在将通讯录读取到NSDictionary中,但是对于一些用户来说,这似乎是崩溃了,我怀疑这是一个内存问题。
是否有其他方法可以在UITableView中显示ABAddressBook联系人,而无需先将其存储在NSDictionary中或使用ABPeoplePicker
发布于 2011-01-24 19:18:19
您可以使用以下方式:
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数组显示它。
发布于 2012-04-13 20:52:51
使用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);发布于 2014-08-04 14:10:42
与Abizern的答案相同,但如果希望显示本地化的全名,请使用ABRecordCopyCompositeName。(英文名称为"First Last",中文名称为"LastFirst")。
ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);
NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);//important for localizationhttps://stackoverflow.com/questions/4781211
复制相似问题