ABPeoplePickerNavigationController自定义

我想使用ABPeoplePickerNavigationController但我想定制视图。 我想要一些联系人的附件图像,我想以不同于默认的方式对它们进行sorting。 有没有办法做到这一点? 或者我必须创build我自己的UITableViewController

如果要以这种方式自定义联系人的外观,则必须创build自己的表格视图。 例如,您可以使用以下方法提取联系人:

 - (void)loadContacts { ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); if (status == kABAuthorizationStatusDenied) { // if you got here, user had previously denied/revoked permission for your // app to access the contacts, and all you can do is handle this gracefully, // perhaps telling the user that they have to go to settings to grant access // to contacts [[[UIAlertView alloc] initWithTitle:nil message:@"This app requires access to your contacts to function properly. Please visit to the \"Privacy\" section in the iPhone Settings app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; return; } CFErrorRef error = NULL; ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); if (error) { NSLog(@"ABAddressBookCreateWithOptions error: %@", CFBridgingRelease(error)); if (addressBook) CFRelease(addressBook); return; } ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { if (error) { NSLog(@"ABAddressBookRequestAccessWithCompletion error: %@", CFBridgingRelease(error)); } dispatch_async(dispatch_get_main_queue(), ^{ if (granted) { // if they gave you permission, then get copy of contacts and reload table self.allContacts = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, NULL, kABPersonSortByLastName)); [self.tableView reloadData]; } else { // however, if they didn't give you permission, handle it gracefully, for example... [[[UIAlertView alloc] initWithTitle:nil message:@"This app requires access to your contacts to function properly. Please visit to the \"Privacy\" section in the iPhone Settings app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; } if (addressBook) CFRelease(addressBook); }); }); } 

然后你可以在你的cellForRowAtIndexPath使用这个数组:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; ABRecordRef person = (__bridge ABRecordRef)self.allContacts[indexPath.row]; NSMutableArray *nameArray = [NSMutableArray array]; NSString *prefix = CFBridgingRelease(ABRecordCopyValue(person, kABPersonPrefixProperty)); if (prefix) [nameArray addObject:prefix]; NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); if (firstName) [nameArray addObject:firstName]; NSString *middleName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonMiddleNameProperty)); if (middleName) [nameArray addObject:middleName]; NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); if (lastName) [nameArray addObject:lastName]; NSString *fullname = [nameArray componentsJoinedByString:@" "]; NSString *suffix = CFBridgingRelease(ABRecordCopyValue(person, kABPersonSuffixProperty)); if (suffix) { fullname = [NSString stringWithFormat:@"%@, %@", fullname, suffix]; } cell.textLabel.text = fullname; NSString *company = CFBridgingRelease(ABRecordCopyValue(person, kABPersonOrganizationProperty)); if ([fullname length] == 0) { cell.textLabel.text = company; cell.detailTextLabel.text = nil; } else { cell.detailTextLabel.text = company; } if ([nameArray count] == 0 && [company length] == 0) NSLog(@"nothing to show!!!"); return cell; } 

显然,考虑到整个想法是你想自定义单元格,相应地修改cellForRowAtIndexPath ,但希望这说明了这个想法。