iPhone ABPeoplePickerNavigationController - How to select two single entries of two different multivalue properties of a person from Addressbook
addressbook, contacts, iphone, objective-c, peoplepicker
Solution
I guess this might be what you want:
- (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;
}
The idea is, to create another ABPersonViewController instance, and let your people picker to push it, since ABPeoplePickerNavigationController is a subclass of NSPeoplePickerNavigationController.
Problem
I'm near desperation as I search for a solution for weeks now. The Problem is simple: - Via the ABPeoplePickerNavigationController (as a ModalView), a person should be selected. - Then only (e.g.) the Mail addresses should be shown and the user should select one. - After selection of a Mail address just the (e.g.) phone numbers should be shown and the user should select one. The solution until the third aspect is well-known: ``` - (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; } ``` The right approach seems to push a similar peoplePicker View on the NavigationController of the ModalView, but I don't know how. If anyone had any idea it would be great! If you want to see such a behavior in action you can have a look at the Amazon app: If you go through the first steps of an order you can select a shipping address exactly this way: From Contact List -> Select a Person -> Select an Address -> Select a Telephone number. There, everything (seems to) take place in the modal view with just a navigation hierarchy with one more level than in the standard code shown above.