Iphone 显示仅包含电子邮件的联系人的地址簿
我想显示一个仅显示电子邮件联系人的ABAddressBook,因此我尝试了以下方法:Iphone 显示仅包含电子邮件的联系人的地址簿,iphone,objective-c,ios,Iphone,Objective C,Ios,我想显示一个仅显示电子邮件联系人的ABAddressBook,因此我尝试了以下方法: ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBook ); f
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
for( CFIndex emailIndex = 0; emailIndex < nPeople; emailIndex++ ) {
ABRecordRef person = CFArrayGetValueAtIndex( allPeople, emailIndex );
ABMutableMultiValueRef emailRef=ABRecordCopyValue(person, kABPersonEmailProperty);
int emailCount = ABMultiValueGetCount(emailRef);
if(emailCount == 0) {
ABAddressBookRemoveRecord(addressBook, person, NULL);
}
}
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.addressBook = addressBook;
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.displayedProperties = @[@(kABPersonEmailProperty)];
ABAddressBookRef addressBook=ABAddressBookCreate();
CFArrayRef allPeople=abAddressBookCopyArrayFallPeople(addressBook);
CFIndex nppeople=ABAddressBookGetPersonCount(地址簿);
对于(CFIndex-emailIndex=0;emailIndex
控制器显示,但所有联系人都显示出来,如果我选择了没有电子邮件的联系人,我会崩溃。如果我调用ABAddressBookSave(),那么它会删除所有带有电子邮件的联系人,但这是一个永久性的更改,甚至会从系统联系人中删除这些联系人。正确的方法是什么?您是否考虑过创建一个临时通讯簿,并用那些有电子邮件地址的联系人填充它?您可能需要构建一个包含电子邮件的联系人数组,然后将其显示在UITableViewController上。这是一种构建此类数组的方法:。您可以使用ABPersonViewController或ABUnknownPersonViewController显示联系人详细信息。您从通讯录中删除了所有没有电子邮件地址的联系人,但最后没有保存通讯录。从ABPeoplePickerNavigationController加载通讯簿时,以前的所有更改都将丢失! 试试这个:
if (ABAddressBookHasUnsavedChanges(addressBook))
ABAddressBookSave(addressBook, NULL)
顺便说一句,不要忘记CFRelease()addressBook、allPeople和emailRef。您是否仅尝试这样显示电子邮件值:
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook );
CFIndex nPeople = ABAddressBookGetPersonCount( addressBook );
for( CFIndex emailIndex = 0; emailIndex < nPeople; emailIndex++ ) {
ABRecordRef person = CFArrayGetValueAtIndex( allPeople, emailIndex );
ABMutableMultiValueRef emailRef=ABRecordCopyValue(person, kABPersonEmailProperty);
int emailCount = ABMultiValueGetCount(emailRef);
if(emailCount == 0) {
ABAddressBookRemoveRecord(addressBook, person, NULL);
}
}
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.addressBook = addressBook;
picker.peoplePickerDelegate = self;
[self presentModalViewController:picker animated:YES];
ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.displayedProperties = @[@(kABPersonEmailProperty)];
也许已经有了,你想要什么?但是没有进行测试。从iOS 8开始,ABPeoplePickerNavigationController有一个属性可以解决您的问题:
@property (nonatomic,copy) predicateForEnablingPerson
来自Apple文档的代码示例:)
请注意,在iOS9中,ABPeoplePickerNavigationController已被弃用,您可以使用新的CNContactPickerServiceController,方法与属性相同:
@property(nonatomic, copy) NSPredicate *predicateForEnablingContact
从文档:
您可以为此属性设置一个值,以确定哪些联系人应成为可选择的联系人,例如emailAddresses。@count>0可使所有具有电子邮件地址的联系人成为可选择的联系人。如果没有为该属性设置谓词,则所有联系人都可以选择。您能举一个例子说明如何操作吗?我不相信您可以让
ABPeoplePickerNavigationController
只显示具有电子邮件地址的联系人,但在iOS 8中,您可以让其禁用(即灰显)那些没有电子邮件地址的联系人。如果您只想显示那些有电子邮件地址的用户,您可以构建一个包含电子邮件地址(和)的用户数组,然后在您自己的表视图中显示在该列表中。这不会隐藏没有电子邮件地址的用户,而是禁止他们被选中。不完全是OP想要的。