我有一个ABAddressBook
在UITableView
. 目前我正在将联系人读取到 中NSDictionary
,但是对于某些用户来说这似乎会崩溃,我怀疑这是内存问题。
是否有另一种方法可以ABAddressBook
在 a 中显示联系人,UITableView
而无需先将它们存储在 anNSDictionary
或 using 中ABPeoplePicker
?
我有一个ABAddressBook
在UITableView
. 目前我正在将联系人读取到 中NSDictionary
,但是对于某些用户来说这似乎会崩溃,我怀疑这是内存问题。
是否有另一种方法可以ABAddressBook
在 a 中显示联系人,UITableView
而无需先将它们存储在 anNSDictionary
或 using 中ABPeoplePicker
?
使用 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);
您可以使用以下方式,
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
在表格视图中使用数组显示它..
与 Abizern 的答案相同,但如果要显示本地化的全名,请使用ABRecordCopyCompositeName
. (英文名是“First Last”,中文名是“LastFirst”)。
ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);
NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);//important for localization