objective-c - 弹出 ABAddressBook 模式,仅包含有电子邮件的联系人

标签 objective-c ios xcode contacts

我正在尝试显示 ABAddressBook 的模式,其中仅包含注册了电子邮件的联系人。我如何实现这一目标?

我尝试了这段代码:

- (IBAction)getContact {
    // creating the picker
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];

    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) {
            CFErrorRef error = nil;
            ABAddressBookRemoveRecord(addressBook, person, &error);
            if (error) NSLog(@"Error: %@", error);
        }
    }
    picker.addressBook = addressBook;
    picker.peoplePickerDelegate = self;
    [self presentModalViewController:picker animated:YES];
}

该列表显示了我的所有联系人,但“已删除”的联系人显示为“无姓名”,而有姓名的联系人则有真实的电子邮件。

最佳答案

我已经设法创建另一个解决方案...

我在数组中添加了至少包含一封电子邮件的联系人...而不是查看当前地址簿并删除其中没有任何电子邮件的联系人的解决方案。这是代码:

    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) {
            CFErrorRef error = nil;
            ABAddressBookRemoveRecord(addressBook, person, &error);
            if (error) NSLog(@"Error: %@", error);
        } else {
            ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
            NSString *email = (__bridge NSString *)ABMultiValueCopyValueAtIndex(emails, 0);
            NSString *name = (__bridge NSString *)(ABRecordCopyValue(person, kABPersonFirstNameProperty));

            if (name) {
                NSMutableDictionary *contactDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                             name, @"name",
                                             email, @"email",
                                             nil];
                [self.contactsArray addObject:contactDict];
            }
        }
    }

关于objective-c - 弹出 ABAddressBook 模式,仅包含有电子邮件的联系人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13861454/

相关文章:

iphone - 网址连接 IOS 5

ios - NSURLSessionDataTask 在 iOS 后台的同一个 NSURLSession 中的 NSURLSessionDownloadTask 之后没有被调用

ios - 可以在iOS应用中使AlertView超时吗?

ios - 如何在 Swift 中使用 AVPlayerViewController 检测全屏模式?

xcode - 使用嵌入式框架项目构建项目时“找不到 MyHeader.h 文件”

swift - 使用 Swift 执行 'killall' 时不允许操作

ios - iPhone 6方向转换问题-UIWindow对象

ios - Xcode 段 Controller 错误

iphone - 为什么我的属性字符串显示得很奇怪?

objective-c - 需要 ios 开发人员的 CGRect 和 CGPoint 帮助