Подтвердить что ты не робот

Как правильно использовать ABPersonViewController с ABPeoplePickerNavigationController для просмотра контактной информации?

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

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


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

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

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

Здесь метод в моем классе ABPeoplePikerNavigationController delegate, который я использую для создания класса 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];

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

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

4b9b3361

Ответ 1

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

Как и раньше, здесь мой метод 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 delegate):

#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).