2010-02-24 9 views
11

Je suis désespéré près que je cherche une solution depuis plusieurs semaines maintenant.iPhone ABPeoplePickerNavigationController - Comment sélectionner deux entrées uniques de deux propriétés différentes d'une valeur multiple personne Addressbook

Le problème est simple:

  • Via le ABPeoplePickerNavigationController (comme ModalView), une personne doit être sélectionnée.
  • Ensuite, seulement (par exemple) les adresses de messagerie doivent être affichées et l'utilisateur doit en sélectionner une.
  • Après sélection d'une adresse de courrier que les numéros de téléphone (par exemple) doivent être affichés et l'utilisateur doit sélectionner un.

La solution jusqu'à ce que le troisième aspect est bien connu:

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

La bonne approche semble pousser Voir Peoplepicker similaire sur le NavigationController du ModalView, mais je ne sais pas comment.

Si quelqu'un avait une idée que ce serait génial! Si vous voulez voir un tel comportement en action, vous pouvez jeter un oeil à l'application Amazon: Si vous passez par les premières étapes d'une commande, vous pouvez sélectionner une adresse de livraison exactement de la façon suivante: Dans la liste de contacts -> Sélectionner une personne -> Sélectionnez une adresse -> Sélectionnez un numéro de téléphone. Là, tout (semble se) avoir lieu dans la vue modale avec juste une hiérarchie de navigation avec un niveau de plus que dans le code standard montré ci-dessus.

Répondre

1

Dans mon iPhone app Pastie, je pris une approche différente. alt text http://manicwave.com/images/pastie/contactdetails.png

J'utilise le Peoplepicker pour sélectionner la personne puis ouvrez un contact (personne) éditeur.

Ceci est juste une vue simple:

Contact Nom numéro de téléphone> par défaut premier numéro de téléphone email adresse> par défaut première adresse e-mail

Chaque numéro de téléphone et adresse e-mail apporter un autre point de vue afficher la liste des téléphones ou des adresses e-mail, avec une coche à côté de celle actuellement sélectionnée.

J'utilise ce point de vue pour la configuration initiale d'un contact ainsi que l'édition ultérieure.

+0

Je suis tellement désolé de ne pas avoir encore répondu! Votre commentaire m'a guidé à la solution qui était presque exactement comme celle de zonble. Merci beaucoup!! –

15

Je suppose que cela pourrait être ce que vous voulez:

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

L'idée est de créer une autre instance ABPersonViewController, et laissez votre sélecteur de personnes pour pousser, puisque ABPeoplePickerNavigationController est une sous-classe de NSPeoplePickerNavigationController.

+0

Je veux vous dire aussi désolé. Ce n'était pas mon intention de ne pas réagir. C'était exactement ce que j'ai cherché! –

+0

Il y a une erreur dans le code - vous ne devez PAS utiliser l'identificateur comme index dans la ligne ABMultiValueCopyValueAtIndex (multi, identifierForValue). Convertir identiefier en index de propriété via ABMultiValueGetIndexForIdentifier –

1

Dans la réponse suggérée il y a une manquerait

CFRelease (multi);

Sans cette version, une fuite se produira. Ou au moins selon la construction et l'analyse en Xcode ....

1

La méthode suivante doit retourner NO:

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

Cela permettra à votre prochaine méthode appelée (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: propriété: identifiant :).