ABMultiValueIdentifier始终为0(零)ABPeoplePicker

时间:2014-10-16 10:31:52

标签: ios objective-c iphone abpeoplepickerview

我试图让用户可以从他们的联系人中选择一个电话号码,然后在UITextField中显示所选的号码。

问题是,无论您在联系人中选择哪个号码,从ABMultiValueIdentifier返回的shouldContinueAfterSelectingPerson始终为0。

这是我的代码:

- (IBAction)btnChooseContactClicked:(id)sender {
    [[UINavigationBar appearance] setBackgroundColor:[UIColor whiteColor]];
    [[UINavigationBar appearance] setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];    

    [picker setDisplayedProperties: [NSArray arrayWithObjects: [NSNumber numberWithInt: kABPersonPhoneProperty], nil]];
    picker.peoplePickerDelegate = self;   

    [self presentModalViewController:picker animated:YES];
}


- (void)peoplePickerNavigationControllerDidCancel:
(ABPeoplePickerNavigationController *)peoplePicker
{
    [self dismissModalViewControllerAnimated:YES];
}


- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    return YES;
}

- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier //Always = 0
{
    [self displayPerson:person property:property identifier:identifier];
    [self dismissModalViewControllerAnimated:YES];
    return NO;
}

- (void)displayPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
    NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);
    NSLog(name);

    if (property == kABPersonPhoneProperty) {
        ABMultiValueRef multiPhones = ABRecordCopyValue(person, kABPersonPhoneProperty);
        for(CFIndex i = 0; i < ABMultiValueGetCount(multiPhones); i++) {
            if(identifier == ABMultiValueGetIdentifierAtIndex (multiPhones, i)) {
                CFStringRef phoneNumberRef = ABMultiValueCopyValueAtIndex(multiPhones, i);
                CFRelease(multiPhones);
                NSString *phoneNumber = (__bridge NSString *) phoneNumberRef;
                CFRelease(phoneNumberRef);
                self.txtTelNo.text = phoneNumber;
            }
        }
    }

}

感觉就像我正在做的一切正确,我跟随了无数其他人似乎没有任何工作。 可能是什么问题?

2 个答案:

答案 0 :(得分:0)

在iOS8中,可以选择在不首先进行身份验证的情况下使用ABPeoplePickerViewController。如果您这样做,那么您只能访问用户选择的值的数据 - 所有其他ID都设置为无效。

在打开ABPeoplePickerViewController之前先尝试进行身份验证,然后检查是否收到了正确的数据。

我在尝试检索被挑选人的缩略图时遇到了同样的问题 - 未经过身份验证,这始终是空的。

答案 1 :(得分:0)

事实证明,我手机中的测试用户是问题所在。 该用户有2个电话号码,两者都设置为“移动”类型。如果是这种情况,似乎选择器看不到它们之间的区别。谁能证实这一点,还是我在这里说出我的屁股?