为什么ABPersonViewController不显示除名称之外的任何属性?

时间:2011-02-16 06:51:56

标签: iphone cocoa-touch ios addressbook

出于某种原因,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];
}

4 个答案:

答案 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等有效。