如何从iOS联系人中仅检索select属性?

时间:2014-09-10 03:47:04

标签: ios objective-c contacts

我们遇到的问题是某些设备上的联系人数据库返回了错误的选择。有没有办法修改以下代码只返回人员联系信息中的选定项目?在这种情况下,我们希望返回来自联系人的确切选择的电子邮件地址。

提前感谢您的帮助!继承人代码......

-(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController     *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:     (ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier{

    NSMutableDictionary *contactInfoDict = [[NSMutableDictionary alloc]
                                            initWithObjects:@[@"", @"", @""]
                                            forKeys:@[@"first_name", @"last_name",     @"email"]];

    // Use a general Core Foundation object.
    CFTypeRef generalCFObject = ABRecordCopyValue(person, kABPersonFirstNameProperty);

    // Get the first name.
    if (generalCFObject) {
        [contactInfoDict setObject:(__bridge NSString *)generalCFObject     forKey:@"first_name"];
        CFRelease(generalCFObject);
    }

    // Get the last name.
    generalCFObject = ABRecordCopyValue(person, kABPersonLastNameProperty);
    if (generalCFObject) {
        [contactInfoDict setObject:(__bridge NSString *)generalCFObject     forKey:@"last_name"];
        CFRelease(generalCFObject);
    }

    // Load selected email addre'
    if (property == kABPersonEmailProperty) {
        ABMultiValueRef emails = ABRecordCopyValue(person, property);
        CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier);
        CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix);

        emailAccount = (__bridge NSString *)(email);
        [contactInfoDict setObject:emailAccount forKey:@"email"];

        if (email) CFRelease(email);
        if (emails) CFRelease(emails);
    }

    // init array
    if (_arrContactsData == nil) {
        _arrContactsData = [[NSMutableArray alloc] init];
    }

    // Send contact to server
    [self sendContact:contactInfoDict];

    // Set data for contacts
    [_arrContactsData addObject:contactInfoDict];

    // Reload the table view data.
    [self.myTable reloadData];

    // Dismiss the address book view controller.
    [_addressBookController dismissViewControllerAnimated:YES completion:nil];

    return NO;
}

1 个答案:

答案 0 :(得分:0)

您的代码是正确的。

用户是否遇到过使用iOS 8的问题?我在iOS 8 beta 6中发现了一个错误。如果您:

  1. 使用电子邮件地址创建联系人:

    create contact

  2. 编辑联系人,添加电子邮件地址并删除其他电子邮件地址:

    edit contact

    (注意,不要只编辑其中一个电子邮件地址,而是添加新的电子邮件地址并删除旧的电子邮件地址。)

  3. 在iOS 7中,如果您遍历电子邮件地址,您将看到:

    {
        identifier = 1;
        index = 0;
        label = "_$!<Work>!$_";
        value = "work@gmail.com";
    },
    {
        identifier = 2;
        index = 1;
        label = "_$!<Other>!$_";
        value = "other@gmail.com";
    }
    

    这是对的。 (首次创建联系人时,标识符为01,当我添加“其他”电子邮件地址时,标识符为2;当我删除“家”时“电子邮件地址,标识为0的电子邮件地址已删除,但其他标识符未正确更改。”因此,如果您点按“工作”电子邮件地址,shouldContinueAfterSelectingPerson将返回{ {1}} ABMultiValueIdentifier转换为1 CFIndex,它将正确返回“工作”电子邮件地址。

    但是,在iOS 8 Beta 6中,0被错误地表示为:

    ABMultiValueRef

    这些标识符不正确。更糟糕的是,如果您点按“工作”电子邮件地址,{ identifier = 0; index = 0; label = "_$!<Work>!$_"; value = "work@gmail.com"; }, { identifier = 1; index = 1; label = "_$!<Other>!$_"; value = "other@gmail.com"; } (取代已弃用的didSelectPerson)将返回shouldContinueAfterSelectingPerson ABMultiValueIdentifier(这应该是是......看起来这个委托方法返回了相应的1,但是这个编辑过的记录的identifier有错误的标识符......不确定他们是怎么做到的!),这意味着ABRecordRef CFIndex,会正确返回“其他”电子邮件地址(!)。

    更糟糕的是,如果您点击了“其他”电子邮件地址,1将返回didSelectPerson ABMultiValueIdentifier(这应该是这样),但如果您尝试检索2,您将获得CFIndex(因为没有此类-1存在)并且因为应用不会检查此问题,所以尝试使用此ABMultiValueIdentifier无效索引会导致崩溃!

  4. 此错误似乎已在iOS8 GM种子中修复,因此它似乎只是一个测试版问题。