如何告诉ABPeoplePickerNavigationController仅列出具有电子邮件地址的联系人?

我希望我的用户通过从地址簿中select联系人的电子邮件来填写电子邮件字段。 我不希望他们滚动所有没有设置电子邮件的联系人,所以我想过滤那些有电子邮件地址的联系人。

这是迄今为止我写的代码。 我可以找出谁有一个电子邮件地址,谁没有,但我不能告诉ABPeoplePickerNavigationController只列出正确的联系人。 这是不可能的,我的意思是我必须通过使用表视图来实现我自己的联系人select器类,或者这段代码有什么问题吗?

 ABAddressBookRef addressBook = ABAddressBookCreate(); NSArray *peopleList = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook); NSLog(@"%ld people exist in the addressBook", ABAddressBookGetPersonCount(addressBook)); for (id peopleRecord in peopleList) { ABMultiValueRef mv = ABRecordCopyValue((ABRecordRef)peopleRecord, kABPersonEmailProperty); CFIndex numberOfAddresses = ABMultiValueGetCount(mv); if(numberOfAddresses == 0) { CFErrorRef err; ABAddressBookRemoveRecord( addressBook, (ABRecordRef)peopleRecord, &err); } } [peopleList release]; NSLog(@"%ld people have an email", ABAddressBookGetPersonCount(addressBook)); ABPeoplePickerNavigationController *peoplePicker = [[ABPeoplePickerNavigationController alloc] init]; NSNumber* emailProp = [NSNumber numberWithInt:kABPersonEmailProperty]; [peoplePicker setAddressBook:addressBook]; peoplePicker.displayedProperties = [NSArray arrayWithObject:emailProp]; [peoplePicker setPeoplePickerDelegate:self]; [self presentModalViewController:peoplePicker animated:YES]; 

我不相信有办法让iOS来做这个过滤。 我也是用代码来做的。 请注意,您需要查找各种电子邮件地址 – 您必须遍历可以获得的字典。 使用这是一个PITA肯定 – 我已经做到了 – 你必须小心,没有内存泄漏。

我所做的是按照你的build议 – 遍历所有联系人,然后用表格popup一个视图,然后select他们想要的人的名字。 我保持一个关联,所以我知道什么地址与什么名字关联,然后使用系统电子邮件框架,然后填充发送到的地址。

我知道这已经很老了,但是我在研究一个相关话题的时候偶然发现了这个,所以我想我会用我的发现来更新这个。

  1. 虽然它不会过滤结果,但值得注意的是,iOS 8具有禁用没有电子邮件地址的联系人的function:

     peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"]; 

    您仍然可以看到所有的联系人,但至less没有电子邮件地址的联系人被禁用。 显然,如果你的最低目标操作系统早于iOS 8,你会有条件地做到:

     if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) { peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"]; } 
  2. 如果你想过滤掉没有地址的条目,你将不得不提出自己的UI(例如创build你自己的tableview)。 所以,首先,build立你自己的电子邮件地址的联系人,如下所示:

     ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (granted) { NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id person, NSDictionary *bindings) { ABMultiValueRef emails = ABRecordCopyValue((__bridge ABRecordRef)person, kABPersonEmailProperty); NSInteger count = ABMultiValueGetCount(emails); CFRelease(emails); return count > 0; }]; NSArray *peopleWithEmails = [allPeople filteredArrayUsingPredicate:predicate]; // You now have an array of `ABRecordRef` associated with // those contacts with email addresses. You can use this as // the model backing your own table view, or populate your // own model. } else { NSLog(@"Access not granted"); if (error) { CFRelease(error); } } }); 

    完成之后,您可以build立自己的tableview,列出来自peopleWithEmails的相关详细信息。