【问题标题】:kABPersonEmailProperty returns weird stuffkABPersonEmailProperty 返回奇怪的东西
【发布时间】:2011-07-12 01:35:27
【问题描述】:

我想像这样获取 ABRecordRef 的电子邮件地址:

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

它返回这个:

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

电子邮件周围的这些东西是什么?我怎样才能摆脱它?谢谢。

【问题讨论】:

    标签: ios cocoa-touch abaddressbook


    【解决方案1】:

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

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

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

    【讨论】:

    • 并且有可能知道该电子邮件的标签吗?如果是来自工作、个人等??
    【解决方案2】:

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

    【讨论】:

    • 如何在Swift 中实现这个我如何循环CFIndex
    【解决方案3】:

    试试这个……

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2022-11-11
      • 2020-11-02
      相关资源
      最近更新 更多