Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 显示仅包含电子邮件的联系人的地址簿_Iphone_Objective C_Ios - Fatal编程技术网

Iphone 显示仅包含电子邮件的联系人的地址簿

Iphone 显示仅包含电子邮件的联系人的地址簿,iphone,objective-c,ios,Iphone,Objective C,Ios,我想显示一个仅显示电子邮件联系人的ABAddressBook,因此我尝试了以下方法: ABAddressBookRef addressBook = ABAddressBookCreate(); CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople( addressBook ); CFIndex nPeople = ABAddressBookGetPersonCount( addressBook ); f

我想显示一个仅显示电子邮件联系人的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];
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想要的。