首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAddressBook在NSDictionary中存储值

ABAddressBook在NSDictionary中存储值
EN

Stack Overflow用户
提问于 2011-01-24 19:02:59
回答 3查看 4.6K关注 0票数 2

我有一个在UITableView中显示ABAddressBook联系人的应用程序。目前我正在将通讯录读取到NSDictionary中,但是对于一些用户来说,这似乎是崩溃了,我怀疑这是一个内存问题。

是否有其他方法可以在UITableView中显示ABAddressBook联系人,而无需先将其存储在NSDictionary中或使用ABPeoplePicker

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-24 19:18:19

您可以使用以下方式:

代码语言:javascript
复制
ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NULL);
NSArray *arrTemp = (NSArray *)ABAddressBookCopyArrayOfAllPeople(ab);

以上两行代码将为您在iPhone上的所有联系人创建一个数组。

现在,无论您想要显示联系人的任何属性,都可以使用以下代码来显示。例如,我想要显示所有联系人的名字,然后创建一个名为arrContact的可变数组。

代码语言:javascript
复制
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数组显示它。

票数 1
EN

Stack Overflow用户

发布于 2012-04-13 20:52:51

使用ARC的另一种方式:

代码语言:javascript
复制
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);
票数 4
EN

Stack Overflow用户

发布于 2014-08-04 14:10:42

与Abizern的答案相同,但如果希望显示本地化的全名,请使用ABRecordCopyCompositeName。(英文名称为"First Last",中文名称为"LastFirst")。

代码语言:javascript
复制
ABRecordRef person = CFArrayGetValueAtIndex(addressBookData, idx);
NSString *fullName = (__bridge_transfer NSString *)ABRecordCopyCompositeName(person);//important for localization
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4781211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档