iOS在阵列中获取所选联系人的电子邮件地址

Ale*_*h72 2 abaddressbook abpeoplepickerview ios

我要做的是向用户显示人物选择器,让他选择他想要的所有联系人,最后将所有这些联系人的电子邮件地址放在一个数组中.最好的方法是只向用户显示电子邮件的联系人.

到目前为止,我唯一能做的就是使用以下代码呈现人员选择器:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
     picker.peoplePickerDelegate = self;
     [self presentModalViewController:picker animated:YES];
Run Code Online (Sandbox Code Playgroud)

然后我试图使用此代码来获取所选联系人的电子邮件:

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

ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty);
[email addObject:(__bridge NSString*)ABMultiValueCopyValueAtIndex(multi, 0)];
[self dismissModalViewControllerAnimated:YES];

return YES;
}
Run Code Online (Sandbox Code Playgroud)

但是一旦我选择了联系人,选择器就会消失,所以我不知道如何继续.此外,当我选择一个联系人时,我在控制台中得到了这个:

"Unbalanced calls to begin/end appearance transitions for 
<ABMembersViewController: 0xa1618c0>."
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

Jef*_*f B 7

我不确定你是否曾解决过你的问题,但如果有人发现这篇文章,也许会帮助他们.我从ABPeoplePickerNavigationController收到电子邮件的做法是删除

[self dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person;
Run Code Online (Sandbox Code Playgroud)

然后我用它来获取电子邮件并解雇控制器

- (BOOL)peoplePickerNavigationController(ABPeoplePickerNavigationController*)peoplePicker
  shouldContinueAfterSelectingPerson:(ABRecordRef)person
                            property:(ABPropertyID)property
                          identifier:(ABMultiValueIdentifier)identifier
{
    if (kABPersonEmailProperty == property)
    {
        ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonEmailProperty);
        NSString *email = (__bridge NSString *)ABMultiValueCopyValueAtIndex(multi, 0);
        NSLog(@"email: %@", email);
        [self dismissModalViewControllerAnimated:YES];
        return NO;
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

它允许用户选择特定的电子邮件并解除控制器没有任何错误.