2009-08-24 18 views
19

Aktualizacja 9/2/10: Ten kod nie działa już od aktualizacji do systemu iOS 4 - kończy się niepowodzeniem z wewnętrzną asercją. Istnieje teraz doskonały przykład interfejsu API Książki adresowej dostępnego w bibliotece referencyjnej iPhone SDK o nazwie "QuickContacts".Jak poprawnie używać ABPersonViewController z ABPeoplePickerNavigationController, aby wyświetlić informacje kontaktowe?

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


Ja próbuje dodać funkcję do mojej aplikacji, która pozwala użytkownikowi wybrać kontakt z ABPeoplePickerNavigationController, który następnie wyświetla ABPersonViewController odpowiadający do kontaktu, który wybrali. W tym momencie chcę, aby użytkownik mógł kliknąć numer telefonu kontaktu i poprosić moją aplikację o zachowanie niestandardowe.

Mam ABPeoplePickerNavigationController działa dobrze, ale biegnę do problemu wyświetlania ABPersonViewController. Mogę sprawić, że obraz na ekranie będzie wyglądał dobrze, ale wyświetli tylko zdjęcie, nazwisko i nazwę kontaktu osoby kontaktowej. Żadne z pozostałych pól kontaktu nie są wyświetlane.

Korzystam z elementu "ViewedProperties" w ABPersonViewController, aby poinformować program o wyświetleniu numerów telefonów. To tworzy dziwne zachowanie; kiedy wybieram kontakt, który nie ma przypisanych numerów telefonów, kontakt pojawi się z "Brak numerów telefonów" napisanym w tle (jak można się spodziewać), ale wybierając kontakt, który ma numer telefonu, dostaję tylko pusta strona kontaktowa (bez tekstu "Brak numerów telefonów").

Oto metoda w moim ABPeoplePickerNavigationController delegata klasy, które używam do tworzenia mojego PersonViewController klasy, która implementuje interfejs 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 mój PersonViewController.h nagłówek file:

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

@interface PersonViewController : UIViewController <ABPersonViewControllerDelegate> 
{ 

} 

- (void) displayContactInfo: (ABRecordRef)person; 

@end 

Wreszcie, oto moja PersonViewController.m który jest stworzenie ABPersonViewController aby zobaczyć 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 jakiś pomysł, dlaczego ja zamiast widząc ten pusty ekran skontaktować się z jednym z klikalny pola numerów telefonów?


W porządku, myślę, że zbliżam się do znalezienia problemu. Jestem prawie pewien, że to z tej części rozmowy displayContactInfo powyżej:

[self setView:personController.view]; 

Kiedy pominąć ten wiersz, wszystko co widzę to czarny ekran po kliknięciu kontakt. ABPeoplePickerNavigationController przesuwa PersonViewController na stos NavigationController.Następnie obiekt PersonViewController tworzy instancję obiektu ABPersonViewController, ale z dowolnego powodu kontroler ABPersonViewController nigdy nie zostanie poprawnie dodany do stosu NavigationController.

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

Odpowiedz

9

Tylko heads-up dla każdego, kto pracuje w ten problem sami: Udało mi się produktu poprawne zachowanie przy uruchamianiu tego ABPersonViewController w swojej delegata viewDidLoad() metody jak poniżej:

Jak poprzednio, oto mojego ABPeoplePickerNavigationController delegata za metoda:

- (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; 
} 

Oto mój PersonViewController.h (ABPersonViewController delegat) nagłówek pliku:

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

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

- (void) displayContactInfo: (ABRecordRef)person; 

@end 

Wreszcie, oto wdrażania delegata za (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 

Mam nadzieję, że to kończy się pomocne dla kogoś. Obsługa interfejsu AddressBook UI framework była dla mnie nieco trudna do opanowania (chociaż jestem nowy w rozwoju iPhone'a, więc wciąż uczę się wielu niuansów związanych z organizacją iPhone'a).

+0

Dzięki za umieszczenie tego. To był najlepszy tutorial, jaki mogłem znaleźć. Teraz muszę po prostu dowiedzieć się, jak uzyskać numer osoby z wybranego wpisu :-) – Akku

Powiązane problemy