出于某种原因,ABPersonViewController
不愿意显示除名称之外的任何属性,无论为其显示什么属性。
我无法使用AddressBookUI
控制器让用户选择要显示的联系人,因为我的UI有自定义要求,否则我会走这条路(就像Apple在他们的示例项目中所做的那样)。
这是不起作用的代码 - 我错过了什么吗?
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// ABContact is of my own creation
ABContact *contact = [self contactAtIndexPath: indexPath];
ABPersonViewController *viewController = [[ABPersonViewController alloc] init];
// This returns a valid ABRecordRef, as indicated by the fact that the
// controller does display the name of this contact when it is loaded
viewController.displayedPerson = contact.record;
// Copied directly from Apple’s QuickContacts sample project
NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],
[NSNumber numberWithInt:kABPersonEmailProperty],
[NSNumber numberWithInt:kABPersonBirthdayProperty], nil];
viewController.displayedProperties = displayedItems;
[self.navigationController pushViewController: viewController animated: YES];
[viewController release];
}
答案 0 :(得分:3)
ABContact来自Erica Sadun的ObjC包装器(ABContactsHelper),对吗?
我也在使用它,并发现由于某种原因,Apple的ABPersonViewController以某种方式将提供的ABRecordRef视为contact.record,与您直接使用C函数的方式不同。 因此:
ABContact *person = ...;
ABPersonViewController *personVC = ...;
personVC.displayedPerson = person.record;
几乎不会将任何内容加载到控制器中。有时是姓/姓,有时甚至不是。但是,如果你这样做:
ABContact *person = ...;
ABPersonViewController *personVC = ...;
ABAddressBookRef addressBook = ABAddressBookCreate();
personVC.displayedPerson = ABAddressBookGetPersonWithRecordID(addressBook, person.recordID);
然后它将加载所有内容。
以前的回答说ABAddressBookCreate是常量需要一个值所必需的,但这已经在[ABContactsHelper addressBook]调用中完成了(我在代码中调用的第一件事)。这真是让人迷惑不解的地方。但是以前确实有效。
答案 1 :(得分:1)
关键是在显示视图控制器之前不释放ABAddressBookRef。我用+initialize
方法创建一个静态实例并保留它。
答案 2 :(得分:0)
在调用以下函数之一之前,这些常量的值是未定义的:ABAddressBookCreate,ABPersonCreate,ABGroupCreate。
以上内容来自apple document。我认为这些属性常数因上述原因无效。
答案 3 :(得分:-1)
此属性列表仅影响显示“属性选择对话框”(选择人员后)。人员联系人的属性(如姓名,中间名,姓氏,公司等)始终相同(在两个对话框中)。如果在列表中包含kABPersonFirstNameProperty,kABPersonMiddleNameProperty等键,则忽略它们,只有kABPersonPhoneProperty,kABPersonEmailProperty等有效。