Latest 0.2.0
License MIT
Platforms ios 8.0, requires ARC
Dependencies APAddressBook
Frameworks UIKit, AddressBook, AddressBookUI

A replacement for ABPeoplePickerNavigationController that supports UILocalized​Indexed​Collation. ZLPeoplePickerViewController was originally created for Talkly.


ABPeoplePickerNavigationController does not work well with contact names of multiple languages, neither does some address book based app that worths $16 billion. Here are some examples:



And this is how it should have been:



Present ABPersonViewController on select


Send group emails on return

Group Emails

Custom Multiple Select

Custom Multiple Select


  • [x] Supports multilingual indexing and sorting by implementing UILocalized​Indexed​Collation using LRIndexedCollationWithSearch.
  • [x] Supports searching by name, emails and addresses. The results are displayed using UISearchController in iOS 8.
  • [x] Supports multiple selection.
  • [x] Supports field mask for filtering contacts.
  • [ ] Support searching by phone number


You can install ZLPeoplePickerViewController through CocoaPods adding the following to your Podfile:

pod ‘ZLPeoplePickerViewController’


Check out the demo app for an example.

ZLPeoplePickerViewController can be initialized and pushed to navigation controller in a way similar to ABPeoplePickerNavigationController:

self.peoplePicker = [[ZLPeoplePickerViewController alloc] init];
self.peoplePicker.delegate = self;
[self.navigationController pushViewController:self.peoplePicker animated:YES];

There is also a convenience method for presenting the people picker modally.

self.peoplePicker = [ZLPeoplePickerViewController presentPeoplePickerViewControllerForParentViewController:self];

Loading a large address book may take a long time. Therefore ZLPeoplePickerViewController caches it in memory after initialization. You can further reduce the first-time delay by initializing the address book with the following class method in advance (for instance, in viewDidLoad).

+ (void)initializeAddressBook;

ZLPeoplePickerViewController uses the fieldMask property to filter contacts, graying out those that have missing information. Currently supported fields inlucde emails, photo and addresses.

@property (nonatomic) ZLContactField filedMask;

The numberOfSelectedPeople property controls the multiple selection behavior. It indicates the maximum number of people the picker can select at a time.

@property (nonatomic) ZLNumSelection numberOfSelectedPeople;

ZLPeoplePickerViewController can have an optional delegate to receive callback.

- (void)peoplePickerViewController:(ZLPeoplePickerViewController *)peoplePicker didSelectPerson:(NSNumber *)recordId {
  // show an ABPersonViewController
  [self showPersonViewController:[recordId intValue] onNavigationController:peoplePicker.navigationController];
- (void)peoplePickerViewController:(ZLPeoplePickerViewController *)peoplePicker didReturnWithSelectedPeople:(NSArray *)people {
  // people will be empty if no person is selected
  if (!people || people.count==0) {return;}
  [self presentViewController: [self alertControllerWithTitle:@"Return with selected people:" Message:[[self firstNameForPeople:people] componentsJoinedByString:@", "]] animated:YES completion:nil];
- (void)newPersonViewControllerDidCompleteWithNewPerson:(nullable ABRecordRef)person {
    NSLog(@"Added a new person");


ZLPeoplePickerViewController uses APAddressBook internally for accessing address book. It requires APAddressBook.


  • iOS 8 or higher.
  • Automatic Reference Counting (ARC).


ZLPeoplePickerViewController is available under MIT license. See the LICENSE file for more info.

Latest podspec

    "name": "ZLPeoplePickerViewController",
    "version": "0.2.0",
    "summary": "A drop-in contact picker that supports UILocalizedu200bIndexedu200bCollation.",
    "description": "ZLPeoplePickerViewController is a drop-in contact picker that supports UILocalizedu200bIndexedu200bCollation.nnFeatures:n---n- Supports multilingual indexing and sorting by implementing UILocalizedu200bIndexedu200bCollation using LRIndexedCollationWithSearch.n- Supports searching by name, emails and addresses. The results are displayed using UISearchController in iOS 8.n- Supports multiple selection.n- Supports field mask for filtering contacts.",
    "homepage": "",
    "screenshots": [
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "Zhixuan Lai": "[email protected]"
    "platforms": {
        "ios": "8.0"
    "source": {
        "git": "",
        "tag": "0.2.0"
    "source_files": [
    "frameworks": [
    "requires_arc": true,
    "dependencies": {
        "APAddressBook": [

Pin It on Pinterest

Share This