Почему ABPersonViewController не показывает никаких свойств, кроме имени? - PullRequest
1 голос
/ 16 февраля 2011

По какой-то причине ABPersonViewController не хочет отображать какие-либо свойства помимо имени, независимо от того, какие свойства установлены для его отображения.

Я не могу использовать контроллеры AddressBookUI, чтобы позволить пользователю выбрать контакт для отображения, так как мой пользовательский интерфейс имеет пользовательские требования, в противном случае я бы пошел по этому пути (как Apple делает в своем примере проекта). *

Вот код, который не работает & mdash; я что-то упустил?

- (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 ]

3 голосов
/ 24 января 2012

ABContact из Обертки Эрики Садун ObjC (ABContactsHelper), верно?

Я тоже его использую и обнаружил, что по какой-то причине ABPersonViewController от Apple почему-то трактует предоставленный 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 голос
/ 22 ноября 2012

Ключ не должен выпускать ABAddressBookRef перед отображением контроллера представления.Я создаю статический экземпляр в методе +initialize и сохраняю его.

0 голосов
/ 22 июля 2012

Этот список свойств влияет только на отображение «диалога выбора свойств» (после выбора человека).Свойства личного контакта, такие как имя, отчество, фамилия, компания и т. Д., Всегда одинаковы (в обоих диалоговых окнах).Если вы включите ключи kABPersonFirstNameProperty, kABPersonMiddleNameProperty и т. Д. В список, они игнорируются, действуют только kABPersonPhoneProperty, kABPersonEmailProperty и т. Д.

0 голосов
/ 16 февраля 2011

Значение этих констант не определено до тех пор, пока не будет вызвана одна из следующих функций: ABAddressBookCreate, ABPersonCreate, ABGroupCreate.

Вышеприведенные сведения получены из яблочный документ .Я думаю, что эти константы свойств недействительны по вышеуказанной причине.

...