我想使用ABPeoplePickerNavigationController
但我想自定义视图。我想要一些联系人的附件图像,并且我想以与默认方式不同的方式对它们进行排序。有没有办法做到这一点?还是我必须创建自己的UITableViewController
?
问问题
256 次
1 回答
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
,但希望这能说明这个想法。
于 2014-08-14T17:44:57.373 回答