我想使用ABPeoplePickerNavigationController
,但我想自定义视图。我想通过一些联系人获得一个附件图像,我想以不同于默认方式的方式对它们进行排序。有办法吗?或者我是否必须创建自己的UITableViewController
?
答案 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
,但希望这说明了这个想法。