2012-09-22 11 views
6

Desidero che i miei utenti riempiano un campo di posta elettronica selezionando l'e-mail di un contatto dalla loro rubrica. Non voglio che scorrano tutti i contatti le cui e-mail non sono impostate, quindi voglio filtrare quelle che hanno indirizzi e-mail.Come dire a ABPeoplePickerNavigationController di elencare solo i contatti che hanno un indirizzo email?

Questo è il codice che ho scritto finora. Posso capire chi ha un indirizzo email e chi no, ma non potrei dire allo ABPeoplePickerNavigationController di elencare solo i contatti giusti. È impossibile ottenere ciò, voglio dire devo implementare la mia classe di selezione dei contatti utilizzando una vista tabella o c'è qualcosa di sbagliato in questo pezzo di codice?

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

risposta

1

Non credo che ci sia un modo per far sì che iOS faccia questo filtraggio. Lo faccio anche nel codice. Si noti che è necessario cercare tutti i tipi di indirizzi e-mail - è necessario ripetere il dizionario che è possibile ottenere. Lavorare con questo è sicuramente un PITA - l'ho già fatto prima - e devi stare attento a non avere perdite di memoria.

Quello che faccio è come suggerisci: scorrere tutti i contatti da solo, poi apro una vista con un tavolo e poi seleziono i nomi delle persone che vogliono. Mantengo un'associazione in giro, quindi so quale indirizzo è associato al nome, quindi utilizzo il framework di posta elettronica del sistema e quindi compilare gli indirizzi di invio.

+0

OK, grazie per i suggerimenti! – aslisabanci

15

So che questo è vecchio, ma mi sono imbattuto in questo mentre ricercavo un argomento correlato, quindi ho pensato di aggiornarlo con le mie scoperte.

  1. Anche se non filtra i risultati, vale la pena notare che iOS 8 dispone di una funzione per disabilitare i contatti che non hanno un indirizzo e-mail:

    peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    

    si vede ancora tutti i contatti, ma almeno quelli senza un indirizzo email sono disabilitati. Ovviamente, se il sistema operativo obiettivo minimo precede iOS 8, devi fare quanto sopra condizionatamente:

    if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) { 
        peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    } 
    
  2. Se si desidera filtrare le voci, senza indirizzi, si dovrà presentare la propria interfaccia utente (ad esempio, creare la tua propria vista sul tavolo) per questo. Quindi, in primo luogo, costruire la propria gamma di contatti con indirizzi di posta elettronica in questo modo:

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

    Fatto questo, si può quindi costruire il proprio Tableview che elenca i dettagli rilevanti da quella peopleWithEmails.

+0

Nota, il codice al punto 2 è per iOS 6 e versioni successive. Se hai bisogno di supporto per versioni precedenti di iOS, non controlli l'autorizzazione con 'ABAddressBookRequestAccessWithCompletion'. – Rob

Problemi correlati