2012-08-17 136 views
2

我想要做的是向用户显示人员选择器,让他选择他想要的所有联系人,并最终将所有联系人的电子邮件地址都放入数组中。 最好的是只显示给用户的电子邮件联系人。iOS获取所选联系人的电子邮件地址

到现在为止我已经能够做的就是展示人与此代码选取器的唯一的事情:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 

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

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

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

return YES; 
} 

但是,只要我选择一个联系人,选取器就会消失,所以我不知道如何继续。 此外,权当我选择一个联系人,我得到这个在控制台:

"Unbalanced calls to begin/end appearance transitions for 
<ABMembersViewController: 0xa1618c0>." 

任何帮助,将不胜感激。

+0

我不相信你可以有电子邮件地址'ABPeoplePickerNavigationController'只显示联系人,但有效的iOS 8,你可以让它禁用(即灰掉)那些没有电子邮件地址的联系人。如果只想显示带有电子邮件地址的人,则可以使用电子邮件地址([和此处显示](http://stackoverflow.com/a/25254013/1271826))构建一个数组,然后在该列表中显示你自己的桌子视图。 – Rob 2014-08-12 15:45:43

回答

7

我不知道你是否曾经解决过你的问题,但如果有人发现这篇文章,也许它会帮助他们。 我做了什么让来自的ABPeoplePickerNavigationController电子邮件是从

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

删除

[self dismissModalViewControllerAnimated:YES]; 

,然后我用这来获得电子邮件和罢免控制器

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

它允许用户选择特定的电子邮件并无误地解散控制器。

+0

谢谢Jeff,最后我做了一些类似你发布的代码,但我忘了发布答案。 – Aleph72 2012-11-01 10:06:14

3

据我所知,这实际上并不会给你选择的电子邮件地址。如果联系人有“家庭”和“工作”电子邮件,则ABMultiValueCopyValueAtIndex(multi, 0)只会给你“家庭”电子邮件。

您需要从标识符中获取所选电子邮件的索引。

- (BOOL)peoplePickerNavigationController: 
(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    if (property == kABPersonEmailProperty) { 
     ABMultiValueRef emails = ABRecordCopyValue(person, property); 
     CFIndex ix = ABMultiValueGetIndexForIdentifier(emails, identifier); 
     CFStringRef email = ABMultiValueCopyValueAtIndex(emails, ix); 

     [self dismissViewControllerAnimated:YES completion:nil]; 

     [self callMethodWithEmailString:(__bridge NSString *)(email)]; 
     if (email) CFRelease(email); 
     if (emails) CFRelease(emails); 
    } 

    return NO; 
} 

相关问题:

相关问题