Как правильно использовать ABPersonViewController с ABPeoplePickerNavigationController для просмотра контактной информации? - PullRequest
19 голосов
/ 24 августа 2009

Обновление 9/2/10: этот код больше не работает с обновлением iOS 4 - он не работает с внутренним утверждением. Теперь в справочной библиотеке iPhone SDK есть отличный пример API адресной книги под названием «QuickContacts».

Пример кода доступен здесь; это поможет вам решить эту проблему: http://developer.apple.com/iphone/library/samplecode/QuickContacts/Introduction/Intro.html


Я пытаюсь добавить в свое приложение функцию, позволяющую пользователю выбрать контакт из ABPeoplePickerNavigationController , который затем отображает ABPersonViewController , соответствующий выбранному контакту. В этот момент я хочу, чтобы пользователь мог щелкнуть телефонный номер контакта, и чтобы мое приложение отвечало по своему усмотрению.

У меня ABPeoplePickerNavigationController работает нормально, но я столкнулся с проблемой при отображении ABPersonViewController . Я могу заставить ABPersonViewController анимировать на экране просто отлично, но он отображает только фотографию контакта, имя и название компании. Ни одно из других полей контакта не отображается.

Я использую элемент displayProperties в ABPersonViewController , чтобы сообщить программе об отображении телефонных номеров. Это создает какое-то странное поведение; когда я выбираю контакт, которому не назначены телефонные номера, контакт отображается с надписью «Нет телефонных номеров» в фоновом режиме (как и следовало ожидать), но при выборе контакта, у которого есть телефонный номер, все, что я получаю, это пустая страница контактов (без текста «Нет телефонных номеров»).

Вот метод в моем ABPeoplePickerNavigationController делегате классе, который я использую для создания моего PersonViewController класса, который реализует интерфейс ABPersonViewController:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    BOOL returnState = NO;

    PersonViewController *personView = [[PersonViewController alloc] init];
    [personView displayContactInfo:person];

    [peoplePicker pushViewController:personView animated:YES];

    [personView release];

    return returnState;
}

Вот мой PersonViewController.h заголовочный файл:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AddressBookUI/AddressBookUI.h>

@interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> 
{

}

- (void) displayContactInfo: (ABRecordRef)person;

@end

Наконец, вот мой PersonViewController.m , который создает ABPersonViewController для просмотра выбранного контакта:

#import "PersonViewController.h"

@implementation PersonViewController

- (void) displayContactInfo: (ABRecordRef)person
{
    ABPersonViewController *personController = [[ABPersonViewController alloc] init];

    personController.personViewDelegate = self;
    personController.allowsEditing = NO;
    personController.displayedPerson = person;
    personController.addressBook = ABAddressBookCreate();

    personController.displayedProperties = [NSArray arrayWithObjects:
            [NSNumber numberWithInt:kABPersonPhoneProperty], 
            nil];

    [self setView:personController.view];

    [[self navigationController] pushViewController:personController animated:YES];
    [personController release];
}

- (BOOL) personViewController:(ABPersonViewController*)personView shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
    return YES;
}


@end

Кто-нибудь имеет какое-либо представление о том, почему я вижу этот пустой экран "Контакт" вместо экрана с интерактивными полями номера телефона?


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

[self setView:personController.view];

Когда я пропускаю эту строку, все, что я вижу, это пустой экран, когда я щелкаю контакт. ABPeoplePickerNavigationController помещает PersonViewController в стек NavigationController. Затем PersonViewController создает экземпляр объекта ABPersonViewController, но по какой-либо причине ABPersonViewController никогда не добавляется должным образом в стек NavigationController.

Кто-нибудь знает, как добавить ABPersonViewController в стек, а не просто PersonViewController?

1 Ответ

9 голосов
/ 31 августа 2009

Просто хедс-ап к любому, кто сам сталкивается с этой проблемой: я смог создать правильное поведение, создав экземпляр ABPersonViewController в методе его делегата viewDidLoad () , как показано ниже:

Как и прежде, вот мой метод моего *1005* ABPeoplePickerNavigationController:

- (BOOL) peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    BOOL returnState = NO;

    PersonViewController *personView = [[PersonViewController alloc] init];

    [peoplePicker pushViewController:personView animated:YES];
    [personView displayContactInfo:person];

    [personView release];

    return returnState;
}

Вот мой заголовочный файл PersonViewController.h (делегат ABPersonViewController):

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import <AddressBookUI/AddressBookUI.h>

@interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> 
{
    ABPersonViewController *personController;
}

- (void) displayContactInfo: (ABRecordRef)person;

@end

Наконец, вот реализация делегата (PersonViewController.m):

#import "PersonViewController.h"

@implementation PersonViewController

- (void) viewDidLoad
{
}

- (void) viewDidUnload
{
    [personController release];
}

- (void) displayContactInfo: (ABRecordRef)person
{
    personController = [[ABPersonViewController alloc] init];
    [personController setDisplayedPerson:person];
    [personController setPersonViewDelegate:self];
    [personController setAllowsEditing:NO];
    personController.addressBook = ABAddressBookCreate();   

    personController.displayedProperties = [NSArray arrayWithObjects:
        [NSNumber numberWithInt:kABPersonPhoneProperty], 
        nil];

    [self setView:personController.view];
}

- (BOOL) personViewController:(ABPersonViewController*)personView shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
    // This is where you pass the selected contact property elsewhere in your program
    [[self navigationController] dismissModalViewControllerAnimated:YES];
    return NO;
}

@end

Надеюсь, это окажется полезным для кого-то. Структура пользовательского интерфейса AddressBook была немного сложной для меня, чтобы обернуться (хотя я новичок в разработке для iPhone, поэтому я все еще изучаю многие нюансы организации программ iPhone).

...