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?