I want my users to fill an email field by selecting a contact\'s email from their address books. I don\'t want them to scroll all the contacts whose emails are not set, so I
I know this is old, but I stumbled across this while researching a related topic, so I thought I'd update this with my findings.
While it doesn't filter the results, it's worth noting that iOS 8 has a feature for disabling contacts that don't have an email address:
peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
You still see all of the contacts, but at least those without an email address are disabled. Obviously, if your minimum target OS predates iOS 8, you'd do the above conditionally:
if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) {
peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
}
If you want to filter out those entries without addresses, you'll have to present your own UI (e.g. create your own tableview) for this. So, first, build your own array of contacts with email addresses like so:
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);
}
}
});
Having done that, you can then build your own tableview listing the relevant details from that peopleWithEmails
.