kABPersonEmailProperty返回奇怪的东西

时间:2011-07-12 01:35:27

标签: ios cocoa-touch abaddressbook

我正在尝试获取A RecordRef的电子邮件地址:

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

它返回了这个:

_$!<Home>!$_ (0x6840af0) - test@test.com (0x6840cc0)

这封电子邮件的内容是什么?我怎么能摆脱它?谢谢。

3 个答案:

答案 0 :(得分:31)

kABPersonEmailProperty的类型为kABMultiStringPropertyType。没有单个电子邮件地址属性,一个人可能有工作的电子邮件地址,一个用于家庭等。 您可以使用ABMultiValueCopyArrayOfAllValues

获取所有电子邮件地址的数组
ABMultiValueRef emailMultiValue = ABRecordCopyValue(ref, kABPersonEmailProperty);
NSArray *emailAddresses = [(NSArray *)ABMultiValueCopyArrayOfAllValues(emailMultiValue) autorelease];
CFRelease(emailMultiValue);

要获取电子邮件地址的标签,请使用ABMultiValueCopyLabelAtIndex。 “_$!<Home>!$”是一个特殊常量,定义为kABHomeLabel,还有kABWorkLabel

答案 1 :(得分:1)

基本上更多关于@omz答案的细节。这是我用来提取家庭电子邮件和人名的代码:

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

答案 2 :(得分:0)

试试这个......

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;