2012-09-22 17 views
6

Quiero que mis usuarios completen un campo de correo electrónico seleccionando el correo electrónico de un contacto de sus libretas de direcciones. No quiero que desplacen todos los contactos cuyos correos electrónicos no están configurados, por lo que quiero filtrar los que tienen direcciones de correo electrónico.¿Cómo decirle a ABPeoplePickerNavigationController que haga una lista solo de los contactos que tienen una dirección de correo electrónico?

Este es el código que he escrito hasta ahora. Puedo averiguar quién tiene una dirección de correo electrónico y quién no, pero no pude decirle al ABPeoplePickerNavigationController que enumere solo los contactos correctos. ¿Es imposible lograr esto? Quiero decir, ¿tengo que implementar mi propia clase de selector de contactos utilizando una vista de tabla o hay algún problema con este fragmento de código?

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

Respuesta

1

No creo que haya una forma de hacer que iOS haga este filtrado. Lo hago en código también. Tenga en cuenta que debe buscar todo tipo de direcciones de correo electrónico; debe repetir el diccionario que puede obtener. Trabajar con esto es un PITA seguro, lo he hecho antes, y debes tener cuidado de no tener pérdidas de memoria.

Lo que hago es lo que sugiere - iterar a través de todos los contactos, luego hago una vista con una tabla y luego selecciono los nombres de las personas que desean. Guardo una asociación para saber qué dirección está asociada con qué nombre, luego uso el marco de correo electrónico del sistema y luego llento las direcciones de envío.

+0

OK, gracias por las sugerencias! – aslisabanci

15

Sé que esto es viejo, pero me encontré con esto mientras investigaba un tema relacionado, así que pensé en actualizar esto con mis hallazgos.

  1. Si bien no filtra los resultados, vale la pena señalar que el IOS 8 tiene una característica para desactivar los contactos que no tienen una dirección de correo electrónico:

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

    sigue viendo toda la contactos, pero al menos aquellos sin una dirección de correo electrónico están deshabilitados. Obviamente, si su sistema operativo objetivo mínimo es anterior iOS 8, que haría lo anterior condicionalmente:

    if ([peoplePickerController respondsToSelector:@selector(predicateForEnablingPerson)]) { 
        peoplePickerController.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
    } 
    
  2. Si desea filtrar las entradas sin direcciones, que tendrá que presentar su propia interfaz de usuario (por ejemplo, crear su propia tabla) para esto. Así, en primer lugar, construir su propia serie de contactos con direcciones de correo electrónico de esta manera:

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

    Una vez hecho esto, a continuación, puede crear su propia lista tableview los detalles relevantes de ese peopleWithEmails.

+0

Tenga en cuenta que el código del punto 2 es para iOS 6 y versiones posteriores. Si necesita soporte para versiones anteriores de iOS, no verifique el permiso con 'ABAddressBookRequestAccessWithCompletion'. – Rob

Cuestiones relacionadas