2011-07-12 7 views
8

Tring para obtener la dirección de correo electrónico de ABRecordRef así:kABPersonEmailProperty vuelve cosas raras

ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i); 
NSString *email = [(NSString*) ABRecordCopyValue(ref, kABPersonEmailProperty) autorelease]; 
NSLog(@"%@", email); 

lo va a devolver esto:

_$!<Home>!$_ (0x6840af0) - [email protected] (0x6840cc0) 

Qué es esto todo el correo electrónico? y ¿cómo puedo deshacerme de él? Gracias.

Respuesta

31

kABPersonEmailProperty es de tipo kABMultiStringPropertyType. No hay ninguna propiedad única dirección de correo electrónico, una persona puede tener una dirección de correo electrónico para el trabajo, uno para el hogar, etc. Usted puede obtener una matriz de todas las direcciones de correo electrónico mediante el uso de ABMultiValueCopyArrayOfAllValues:

ABMultiValueRef emailMultiValue = ABRecordCopyValue(ref, kABPersonEmailProperty); 
NSArray *emailAddresses = [(NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue) autorelease]; 
CFRelease(emailMultiValue); 

Para obtener las etiquetas de las direcciones de correo electrónico, use ABMultiValueCopyLabelAtIndex. "_$!<Home>!$" es una constante especial que se define como kABHomeLabel, también hay kABWorkLabel.

+1

y es posible saber la etiqueta de ese correo electrónico? si es del trabajo, personal, etc. – 88fsantos

0

Prueba este ......

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
picker.peoplePickerDelegate = self; 
// Display only a person's phone, email, and birthdate 
NSArray *displayedItems = [NSArray arrayWithObjects: 
[NSNumber numberWithInt:kABPersonPhoneProperty], 
[NSNumber numberWithInt:kABPersonEmailProperty], 
[NSNumber numberWithInt:kABPersonBirthdayProperty], nil]; 
picker.displayedProperties = displayedItems; 
1

detalles Básicamente más solicitud de respuesta @omz. Aquí está el código que utilicé, que extrae el correo electrónico del hogar y el nombre de la persona:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty); 
    for (CFIndex i = 0; i < ABMultiValueGetCount(emails); i++) { 
     NSString *label = (__bridge NSString *) ABMultiValueCopyLabelAtIndex(emails, i); 
     if ([label isEqualToString:(NSString *)kABHomeLabel]) { 
      NSString *email = (__bridge NSString *) ABMultiValueCopyValueAtIndex(emails, i); 
      _emailTextField.text = email; 
     } 
    } 
    CFRelease(emails); 


    NSString *first = (__bridge NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty); 
    NSString *last = (__bridge NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty); 

    if (first && first.length > 0 && last && last.length > 0) { 
     _nicknameTextField.text = [NSString stringWithFormat:@"%@ %@", first, last]; 
    } else if (first && first.length > 0) { 
     _nicknameTextField.text = first; 
    } else { 
     _nicknameTextField.text = last; 
    } 

    [self dismissModalViewControllerAnimated:YES]; 

    return NO; 
} 
+1

¿Cómo puedo implementar esto en 'Swift'? ¿Cómo puedo iterar' CFIndex' –