Comment dire à ABPeoplePickerNavigationController de listr uniquement les contacts qui ont une adresse email?

Je souhaite que mes users remplissent un champ d'e-mail en sélectionnant l'adresse e-mail d'un contact dans leur carnet d'adresses. Je ne veux pas qu'ils fassent défiler tous les contacts dont les e-mails ne sont pas définis, donc je veux filterr ceux qui ont des adresses e-mail.

C'est le code que j'ai écrit jusqu'ici. Je peux comprendre qui a une adresse e-mail et qui ne l'a pas mais je ne pouvais pas dire à ABPeoplePickerNavigationController de listr uniquement les bons contacts. Est-il impossible de réaliser cela, je veux dire dois-je mettre en œuvre ma propre class de sélecteur de contact en utilisant une vue de table ou y at-il quelque chose de mal avec ce morceau de code?

 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]; 

Je ne crois pas qu'il existe un moyen d'get iOS pour faire ce filtrage. Je le fais aussi dans le code. Notez que vous devez chercher toutes sortes d'adresses email – vous devez parcourir le dictionary que vous pouvez get. Travailler avec ceci est un PITA à coup sûr – je l'ai déjà fait – et vous devez faire attention à ne pas avoir de memory leaks.

Ce que je fais est comme vous le suggérez – itérer à travers tous les contacts moi-même, puis j'applique une vue avec une table et je choisis ensuite les noms des personnes qu'ils veulent. Je garde une association autour de sorte que je sache quelle adresse est associée à quel nom, puis utilisez l'infrastructure de messagerie du système, puis remplissez les adresses d'envoi.

Je sais que c'est vieux, mais j'ai trébuché dessus tout en recherchant un sujet connexe, donc j'ai pensé mettre à jour ceci avec mes résultats.

  1. Bien qu'il ne filter pas les résultats, il convient de noter que iOS 8 dispose d'une fonction permettant de désactiver les contacts qui n'ont pas d'adresse électronique:

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

    Vous voyez toujours tous les contacts, mais au less ceux sans adresse électronique sont désactivés. De toute évidence, si votre operating system cible minimum est antérieur à iOS 8, vous devez procéder comme suit:

     if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) { peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"]; } 
  2. Si vous voulez filterr ces inputs sans adresses, vous devrez présenter votre propre interface user (par exemple créer votre propre vue de table) pour cela. Donc, d'abord, construisez votre propre tableau de contacts avec des adresses e-mail comme ceci:

     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); } } }); 

    Après avoir fait cela, vous pouvez ensuite créer votre propre tableview listant les détails pertinents à partir de ce peopleWithEmails .