ABPeoplePickerNavigationController自定义

时间:2014-08-14 13:21:29

标签: ios abaddressbook abpeoplepickerview

我想使用ABPeoplePickerNavigationController,但我想自定义视图。我想通过一些联系人获得一个附件图像,我想以不同于默认方式的方式对它们进行排序。有办法吗?或者我是否必须创建自己的UITableViewController

1 个答案:

答案 0 :(得分:1)

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

- (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,但希望这说明了这个想法。