6

我想显示一个仅显示带有电子邮件的联系人的 ABAddressBook,所以我尝试了这样的操作:

    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];

控制器显示,但显示所有联系人,如果我选择没有电子邮件的联系人,我会崩溃。如果我调用了 ABAddressBookSave(),那么它会通过电子邮件删除所有联系人,但这是一个永久性更改,甚至会从系统联系人中删除它们。这样做的正确方法是什么?

4

5 回答 5

1

您可能需要构建一个包含电子邮件的联系人数组,然后将其显示在 UITableViewController 上。这是构建此类数组的一种方法:https ://stackoverflow.com/a/13980023/745862 。您可以使用 ABPersonViewController 或 ABUnknownPersonViewController 来显示联系人详细信息。

于 2013-05-16T07:27:25.443 回答
0

您是否尝试仅像这样显示电子邮件值:

ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
picker.displayedProperties = @[@(kABPersonEmailProperty)];

也许已经做到了,你想要什么?虽然没有测试。

于 2014-02-02T11:30:29.817 回答
0

您从地址簿中删除了所有没有电子邮件地址的联系人,但最后没有保存地址簿。当从 ABPeoplePickerNavigationController 加载 AddressBook 时,之前的所有更改都将丢失!尝试这个:

if (ABAddressBookHasUnsavedChanges(addressBook))
    ABAddressBookSave(addressBook, NULL)

顺便说一句,不要忘记 CFRelease() addressBook、allPeople 和 emailRef。

于 2014-02-02T11:23:32.973 回答
0

您是否考虑过创建一个临时地址簿并在其中填写那些具有电子邮件地址的联系人?

于 2012-08-18T19:28:43.437 回答
0

从 iOS 8 开始,ABPeoplePickerNavigationController 有一个属性可以解决您的问题:

@property (nonatomic,copy) predicateForEnablingPerson

Apple 文档中的代码示例:https ://developer.apple.com/library/prerelease/ios/samplecode/PeoplePicker/Listings/PeoplePicker_AAPL_8or7_EmailPickerViewController_m.html )

ABPeoplePickerNavigationController* abPicker = [ABPeoplePickerNavigationController new];
abPicker.peoplePickerDelegate = self;
//...
if ([abPicker respondsToSelector:@selector(setPredicateForEnablingPerson:)]){
    // The people picker will enable selection of persons that have at least one email address.
    abPicker.predicateForEnablingPerson = [NSPredicate predicateWithFormat:@"emailAddresses.@count > 0"];
}

请注意,从 iOS9 开始,ABPeoplePickerNavigationController 已被弃用,您可以以与属性相同的方式使用新的CNContactPickerViewController :

@property(nonatomic, copy) NSPredicate *predicateForEnablingContact

从文档:

您可以为此属性设置一个值,以确定应选择哪个联系人,例如 emailAddresses.@count > 0 以使所有具有电子邮件地址的联系人成为可选择的。如果没有为此属性设置谓词,则所有联系人都变为可选择的。

于 2015-10-21T12:44:49.050 回答