Jak poprawnie używać ABPersonViewController z ABPeoplePickerNavigationController do przeglądania informacji kontaktowych?

Aktualizacja 9/10/10: Ten kod nie działa już z aktualizacją iOS 4 - kończy się niepowodzeniem z wewnętrzną asercją. Obecnie istnieje świetny przykład interfejsu API Książki adresowej dostępny w Bibliotece referencyjnej SDK iPhone'a o nazwie „QuickContacts”.

Przykładowy kod jest dostępny tutaj; pomoże ci rozwiązać ten problem:http://developer.apple.com/iphone/library/samplecode/QuickContacts/Introduction/Intro.html

Próbuję dodać funkcję do mojej aplikacji, która pozwala użytkownikowi wybrać kontakt zABPeoplePickerNavigationController, który następnie wyświetlaABPersonViewController odpowiadający wybranemu kontaktowi. W tym momencie chcę, aby użytkownik mógł kliknąć numer telefonu kontaktu i aby moja aplikacja reagowała niestandardowymi zachowaniami.

MamABPeoplePickerNavigationController działa dobrze, ale mam problem z wyświetleniemABPersonViewController. Mogę dostaćABPersonViewController animować na ekranie, ale wyświetla tylko zdjęcie kontaktu, nazwę i nazwę firmy. Żadne inne pola kontaktu nie są wyświetlane.

Używam elementu 'wyświetlonyProperties' wABPersonViewController aby powiedzieć programowi, aby wyświetlał numery telefonów. Stwarza to dziwne zachowanie; gdy wybieram kontakt bez przypisanych numerów telefonów, kontakt wyświetla się z napisem „Brak numerów telefonów” w tle (zgodnie z oczekiwaniami), ale podczas wybierania kontaktu, który ma numer telefonu, otrzymuję tylko pusta strona kontaktu (bez tekstu „Brak numerów telefonów”).

Oto metoda w moimDelegat ABPeoplePickerNavigationController klasa, której używam do tworzenia mojegoPersonViewController klasa, która implementujeInterfejs 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;
}

Oto mojaPersonViewController.h plik nagłówkowy:

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

@interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> 
{

}

- (void) displayContactInfo: (ABRecordRef)person;

@end

Wreszcie, oto mojaPersonViewController.m to tworzyABPersonViewController aby wyświetlić wybrany kontakt:

#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

Czy ktoś ma pojęcie, dlaczego widzę ten pusty ekran kontaktu zamiast jednego z klikalnymi polami numeru telefonu?

W porządku, myślę, że zbliżam się do znalezienia problemu. Jestem całkiem pewien, że jest to część tej rozmowy displayContactInfo powyżej:

[self setView:personController.view];

Gdy pomijam ten wiersz, widzę tylko pusty ekran, gdy klikam kontakt. ABPeoplePickerNavigationController przesuwa PersonViewController na stos NavigationController. Następnie PersonViewController tworzy instancję obiektu ABPersonViewController, ale z jakiegoś powodu ABPersonViewController nigdy nie zostanie poprawnie dodany do stosu NavigationController.

Czy ktoś wie, jak dodać ABPersonViewController do stosu, a nie tylko PersonViewController?

questionAnswers(1)

yourAnswerToTheQuestion