2010-02-24 5 views
11

Ich bin fast Verzweiflung, wie ich seit Wochen eine Lösung suche.iPhone ABPeoplePickerNavigationController - So wählen Sie zwei einzelne Einträge von zwei verschiedenen mehrwertigen Eigenschaften einer Person aus Adressbuch

Das Problem ist einfach:

  • über die ABPeoplePickerNavigationController (als ModalView), eine Person ausgewählt werden soll.
  • Dann sollten nur (z. B.) die Mail-Adressen angezeigt werden und der Benutzer sollte einen auswählen.
  • Nach Auswahl einer Mail-Adresse sollten nur die (z. B.) Telefonnummern angezeigt werden und der Benutzer sollte eine auswählen.

Die Lösung bis zum dritten Aspekte ist bekannt:

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

Der richtige Ansatz scheint einen ähnlichen People Blick auf der Navigation der ModalView zu schieben, aber ich weiß nicht, wie.

Wenn jemand eine Idee hätte, wäre es großartig!

Wenn Sie ein solches Verhalten in Aktion sehen möchten, können Sie sich die Amazon App ansehen: Wenn Sie die ersten Schritte einer Bestellung durchlaufen, können Sie eine Lieferadresse genau so wählen: Aus Kontaktliste -> Auswählen eine Person -> Wählen Sie eine Adresse -> Wählen Sie eine Telefonnummer. Dort (anscheinend) findet alles in der modalen Ansicht mit nur einer Navigationshierarchie mit einer weiteren Ebene als in dem oben gezeigten Standardcode statt.

Antwort

1

In meiner iPhone App Pastie nahm ich einen anderen Ansatz. alt text http://manicwave.com/images/pastie/contactdetails.png

Ich benutze den peoplePicker, um die Person auszuwählen und dann einen Kontakt (Person) Editor zu öffnen.

Dies ist nur eine einfache Ansicht:

Kontakt Name Telefonnummer> standardmäßig erste Telefonnummer E-Mail-Adresse> standardmäßig erste E-Mail-Adresse

eine andere Ansicht Jede Telefonnummer und E-Mail-Adresse bringen Zeigt die Liste der Telefone oder E-Mail-Adressen mit einem Häkchen neben dem aktuell ausgewählten an.

Ich benutze diese Ansicht für die Ersteinrichtung eines Kontakts sowie die anschließende Bearbeitung.

+0

Es tut mir so leid, dass ich noch nicht geantwortet habe! Ihr Kommentar führte mich zu der Lösung, die fast genau wie die von Zonble war. Vielen Dank!! –

15

ich denke, das könnte das sein, was Sie wollen:

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

Die Idee ist, eine andere ABPersonViewController Instanz zu erstellen, und Ihre Leute Picker schieben lassen, da ABPeoplePickerNavigationController eine Unterklasse von NSPeoplePickerNavigationController ist.

+0

Ich möchte dich auch entschuldigen. Es war nicht meine Absicht, nicht zu reagieren. Genau das habe ich gesucht! –

+0

Es gibt einen Fehler im Code - Sie sollten den Bezeichner NICHT als Index in der Zeile ABMultiValueCopyValueAtIndex (multi, identifierForValue) verwenden. Konvertieren von IDF in einen Eigenschaftsindex über ABMultiValueGetIndexForIdentifier –

1

In der vorgeschlagenen Antwort gibt es eine Release

CFRelease (multi) fehlt;

Ohne diese Freigabe tritt ein Leck auf. Oder zumindest nach Build und Analyse in Xcode ....

1

Das folgende Verfahren sollte keine Rückkehr:

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

Das nächste Methode aufgerufen werden erlaubt (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: Eigenschaft: Bezeichner :).