2010-02-24 12 views
11

Jestem blisko desperacji, gdy szukam rozwiązania od wielu tygodni.iPhone ABPeoplePickerNavigationController - Jak wybrać dwa pojedyncze wpisy dwóch różnych właściwości wielowartościowych osoby z książki adresowej

Problem jest prosty:

  • Przez ABPeoplePickerNavigationController (jako ModalView), osoba powinna być zaznaczona.
  • Następnie należy podać (np.) Adresy pocztowe, a użytkownik powinien wybrać jeden.
  • Po wybraniu adresu e-mail należy wyświetlić (np.) Numery telefonów, a użytkownik powinien wybrać jeden z nich.

Rozwiązanie aż do trzeciego aspektu jest dobrze znane:

- (IBAction)importFromAddressBook 
{ 
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]]; 
    return YES; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    //===PROBLEM=== Now I do have a mail address and I want to have a phone number right afterwards. 

    //Something like this would be straightforward, but the view does not change this way: 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]]; 
    //Here misses the important code. 


    //And only when I also got a phone number through this or a similar method I want to call: 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 

    //I do not want to start default behaviour with the mailaddress and/or phone number: 
    return NO; 
} 

Właściwe podejście wydaje się pchnąć podobny peoplePicker Widok na NavigationController z ModalView, ale nie wiem jak.

Jeśli ktokolwiek miał pomysł, byłoby wspaniale!

Jeśli chcesz zobaczyć takie zachowanie w działaniu, możesz rzucić okiem na aplikację Amazon: Jeśli wykonasz pierwsze kroki w ramach zamówienia, możesz wybrać adres wysyłki dokładnie w ten sposób: Z listy kontaktów -> Wybierz Osoba -> Wybierz adres -> Wybierz numer telefonu. Tam wszystko (wydaje się) ma miejsce w widoku modalnym z tylko hierarchią nawigacji o jeden poziom wyżej niż w standardowym kodzie pokazanym powyżej.

Odpowiedz

1

W mojej aplikacji na iPhone'a Pastie zastosowałem inne podejście. alt text http://manicwave.com/images/pastie/contactdetails.png

Używam peoplePicker, aby wybrać osobę, a następnie otworzyć edytor kontaktów (osoby).

To jest tylko prosty widok:

kontaktowa Imię Numer telefonu> domyślnie pierwszy numer telefonu adres e-mail> domyślnie pierwszego adresu email

Każdy numer telefonu i adres poczty elektronicznej wprowadzają się inny widok pokazuje listę telefonów lub adresów e-mail z zaznaczeniem obok aktualnie zaznaczonego.

Używam tego widoku do wstępnej konfiguracji kontaktu, a także do dalszej edycji.

+0

Bardzo mi przykro, nie odpowiedziałem jeszcze! Twój komentarz poprowadził mnie do rozwiązania, które było niemal identyczne jak rozwiązanie zonble. Dziękuję Ci bardzo!! –

15

myślę, że to może być to, co chcesz:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 

    ABPersonViewController *controller = [[ABPersonViewController alloc] init]; 
    controller.displayedPerson = person; 
    controller.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; 
    controller.personViewDelegate = self; 
    [peoplePicker pushViewController:controller animated:YES]; 
    [controller release]; 
    return NO; 
} 

- (BOOL)personViewController:(ABPersonViewController *)personViewController 
shouldPerformDefaultActionForPerson:(ABRecordRef)person 
        property:(ABPropertyID)property 
        identifier:(ABMultiValueIdentifier)identifierForValue 
{ 
    ABMutableMultiValueRef multi = ABRecordCopyValue(person, property); 
    CFStringRef phone = ABMultiValueCopyValueAtIndex(multi, identifierForValue); 
    NSLog(@"phone %@", (NSString *)phone); 
    CFRelease(phone); 

    ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)personViewController.navigationController; 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 
    return NO; 
} 

Chodzi o to, aby utworzyć inną instancję ABPersonViewController i niech ludzie kompletacji, aby go przesunąć, ponieważ ABPeoplePickerNavigationController jest podklasą NSPeoplePickerNavigationController.

+0

Też chcę Ci współczuć. Nie miałem zamiaru nie reagować. Właśnie tego szukałem! –

+0

Wystąpił błąd w kodzie - NIE należy używać identyfikatora jako indeksu w linii ABMultiValueCopyValueAtIndex (multi, identyfikatorForValue). Konwertuj identyfikator do indeksu właściwości za pomocą ABMultiValueGetIndexForIdentifier –

1

W sugerowanej odpowiedź jest uwolnienie brakuje

CFRelease (multi);

Bez tego wydania nastąpi wyciek. Lub przynajmniej zgodnie z Build and Analyze w Xcode ....

1

Poniższa metoda powinna powrócić NO:

- (BOOL)peoplePickerNavigationController: 
    (ABPeoplePickerNavigationController*)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    ... 
    return NO; 
} 

Pozwoli to następnym sposób nazwać (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: właściwość: identyfikator :).

Powiązane problemy